intmain() { int n, m; scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d", &arr[i]); scanf("%d", &m); block = sqrt(n); for(int i = 1; i <= m; i++) { scanf("%d", &q[i].l); scanf("%d", &q[i].r); q[i].id = i; } sort(q+1, q+m+1, cmp); int l = 0, r = 0; for(int i = 1; i <= m; i++) { int ql = q[i].l, qr = q[i].r; while(l<ql)del(l++); while(l>ql)add(--l); while(r<qr)add(++r); while(r>qr)del(r--); Ans[q[i].id] = ans; } for(int i = 1; i <= m; i++) printf("%d\n", Ans[i]); return0; }
voidupd(int now, int i)//在第 i 个询问进行第 now 次修改 { if(u[now].pos >= q[i].l && u[now].pos <= q[i].r) //修改的位置在询问区间内才会产生影响 { del(arr[u[now].pos]); //删掉第 pos 位上的数 add(u[now].k); //增加修改完的数 } //如果我们这一次修改把 x 变成了 y,下次如果要改回来就不是把 x 变成 y 了, //而是应当把 y 变成 x,所以我们修改完后我们要把 x 和 y 交换 swap(arr[u[now].pos], u[now].k); }
voidmo() { sort(q+1, q+cntQ+1, cmp); int l = 1, r = 0, now = 0; //初始左端点为 1,右端点为 0,进行了 0 次修改 for(int i = 1; i <= cntQ; i++) { int ql = q[i].l, qr = q[i].r, qt=q[i].t; while(l>ql)add(arr[--l]); while(r<qr)add(arr[++r]); while(l<ql)del(arr[l++]); while(r>qr)del(arr[r--]); while(now<qt) upd(++now, i); while(now>qt) upd(now--, i); Ans[q[i].id] = ans; } } intmain() { int n, m; scanf("%d %d", &n, &m); for(int i = 1; i <= n; i++) scanf("%d", &arr[i]); block = pow(n, 0.6666666666); char op; int l, r; for(int i = 1; i <= m; i++) { getchar(); scanf("%c %d %d", &op, &l, &r); if(op == 'Q') { cntQ++; //记录共 cntQ 个查询 q[cntQ].l = l; q[cntQ].r = r; q[cntQ].t = cntR; q[cntQ].id = cntQ; } else { cntR++; //记录共 cntR 个修改 u[cntR].pos = l; u[cntR].k = r; } } mo(); for(int i = 1; i <= cntQ; i++) printf("%d\n", Ans[i]); return0; }