用set维护有序序列
或许sort也可以,但这题的前驱定义是严格小于
所以要去重
然后就是记得自己打的加法tag在query的时候一定要算上
话说这题数据有点fake啊忘了查询算上自己的标记了还有70
然后还有玄学优化
块的大小从( sqrt x )变成1000每个点能快300ms的样子qwq
似乎原理是减少维护的set的个数吧
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <set>
#include <cmath>
using namespace std;
const int MAXN = 101000;
int n,sz,num,tag[MAXN],a[MAXN],belong[MAXN];
set<int> b[105];
void calbe(int n){
for(int i=1;i<=n;i++)
belong[i]=(i-1)/sz+1;
}
void reset(int x){
b[x].clear();
for(int i=(x-1)*sz+1;i<=min(x*sz,n);i++)
b[x].insert(a[i]);
}
void update(int l,int r,int w){
int xl=belong[l];
int xr=belong[r];
for(int i=l;i<=min(xl*sz,r);i++){
b[xl].erase(a[i]);
a[i]+=w;
b[xl].insert(a[i]);
}
if(xl!=xr){
for(int i=(xr-1)*sz+1;i<=r;i++){
b[xr].erase(a[i]);
a[i]+=w;
b[xr].insert(a[i]);
}
}
for(int i=xl+1;i<=xr-1;i++)
tag[i]+=w;
}
int query(int l,int r,int w){
int xl=belong[l];
int xr=belong[r];
int ans=-1;
for(int i=l;i<=min(r,xl*sz);i++)
if(a[i]<w-tag[xl]&&a[i]+tag[xl]>ans)
ans=a[i]+tag[xl];
if(xl!=xr){
for(int i=(xr-1