Example #1
0
// 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;
}