为啥带修莫队中的修改是先修改完后移动的,就如:
//直接开始交换
rep(i, 1, T) ops[i].x = a[ops[i].p]/*未交换的值*/, a[ops[i].p] = ops[i].y;
sort(qu + 1, qu + qcnt + 1, cmp);
int tm = T; //时间戳
for(int i = 1, l = qu[1].l, r = qu[1].l - 1; i <= qcnt; i++){
while(l < qu[i].l) Del(a[l++]);
while(r > qu[i].r) Del(a[r--]);
while(l > qu[i].l) Add(a[--l]);
while(r < qu[i].r) Add(a[++r]);
while(tm < qu[i].pre) tm++, modify(ops[tm].p, ops[tm].y, l, r);
while(tm > qu[i].pre) modify(ops[tm].p, ops[tm].x, l, r), tm--;
ans[qu[i].id] = query();
}
我有另一种想法就是先不修改,但错了 如下:
//直接开始交换
rep(i, 1, T) ops[i].x = a[ops[i].p]/*未交换的值*/;
sort(qu + 1, qu + qcnt + 1, cmp);
int tm = 0; //时间戳
for(int i = 1, l = qu[1].l, r = qu[1].l - 1; i <= qcnt; i++){
//?顺序
while(l < qu[i].l) Del(a[l++]);
while(r > qu[i].r) Del(a[r--]);
while(l > qu[i].l) Add(a[--l]);
while(r < qu[i].r) Add(a[++r]);
while(tm < qu[i].pre) tm++, modify(ops[tm].p, ops[tm].y, l, r);
while(tm > qu[i].pre) modify(ops[tm].p, ops[tm].x, l, r), tm--;
ans[qu[i].id] = query();
}