// Merges two points with 5 neibs void Mesh::mergeVertex() { calcEdge(); for(size_t i = 0; i < vb.size(); i++){ int v1 = vb[i]; int v2 = ve[i]; int n1 = pts[v1].neib.size(); int n2 = pts[v2].neib.size(); if( n1 == 5 && n2 == 5 ){ // Dont merge futher these points pts[v1].neib.push_back(-1); pts[v2].neib.push_back(-1); changeVertex(v1, v2); delVertex(v2); for (const int itr : pts[v2].neibTria) { Triangle &tr = tri[itr]; if( tr.v1 == v2 ) tr.v1 = v1; if( tr.v2 == v2 ) tr.v2 = v1; if( tr.v3 == v2 ) tr.v3 = v1; } delTria(tria1[i]); delTria(tria2[i]); } } pack(); calcNeigTria(); calcNeigbor(); }
int main() { // freopen("in.txt", "r+t", stdin); // freopen("out.txt", "w+t", stdout); int n, m, q, t; int cases = 0; while (scanf("%d %d", &n, &m) == 2 && n) { tree.init(); for (int i = 1; i <= n; i++) scanf("%d", &w[i]); for (int i = 1; i <= m; i++) scanf("%d %d", &edgeX[i], &edgeY[i]); int exists[MAXM] = {}; for (int i = 1; i <= m; i++) exists[i] = 1; for (q = 0; scanf("%s", cmd[q]) == 1 && cmd[q][0] != 'E'; q++) { if (cmd[q][0] == 'D') scanf("%d", &QX[q]), exists[QX[q]] = 0; else if (cmd[q][0] == 'C') scanf("%d %d", &QX[q], &QY[q]), t = QY[q], QY[q] = w[QX[q]], w[QX[q]] = t; else if (cmd[q][0] == 'Q') scanf("%d %d", &QX[q], &QY[q]); } for (int i = 1; i <= n; i++) root[i] = null; for (int i = 1; i <= n; i++) tree.insert(root[i], w[i]); initDisjointSet(n); for (int i = 1; i <= m; i++) if (exists[i] == 1) joint(edgeX[i], edgeY[i]); double ret = 0, cnt = 0; for (int i = q - 1; i >= 0; i--) { if (cmd[i][0] == 'D') joint(edgeX[QX[i]], edgeY[QX[i]]); else if (cmd[i][0] == 'C') changeVertex(QX[i], QY[i]); else if (cmd[i][0] == 'Q') { cnt++; node* v = tree.rkth_element(root[findp(QX[i])], QY[i]); if (v == null) /*puts("undefined")*/; else ret += v->key/*, printf("kth %d\n", v->key)*/; } } ret /= cnt; printf("Case %d: %lf\n", ++cases, ret); } return 0; }