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; }
JobSchedule(job jobs[]) { int f[50],l,ji[50],m,b,q,k,i; qsort(jobs,n,sizeof(job),jobCmp); b = min(n,4); initDisjointSet(b); k = 0; for (i = 0 ;i<= b;i++) f[i] = i; for (i = 0 ;i<= (n-1);i++) { q = CFind(min(5, jobs[i].deadline)); if (f[q] != 0) { ji[k++] = jobs[i].id; m = CFind(f[q] - 1); Wunion(m, q); f[q] = f[m]; } } for(l=0;l<b;l++) printf("%d\t",ji[l]); }