分块题都先考虑一个操作:
如果每次操作都是 [ 1 , n ] [1,n] [1,n],
那么我们建一个大根堆,每次删除最大值,再把 A A A塞进去即可。
再考虑一个操作:
操作完之后要根据堆和初始的数组更新出现在的数组。
看一行代码:
for(int i=st[id];i<=ed[id];i++) q[id].push(a[i]),a[i]=q[id].top(),q[id].pop();
所以我们就完成了整块打标记和散块重构。
A C C o d e \mathcal{AC \ Code} AC Code
#include <bits/stdc++.h>
#define maxn 400005
#define S 705
#define rep(i, j, k) for (