为啥这个代码maxn设为1800010会TLE on #7
下数据看了一下#7点数最多在8e5左右
所以不是很明白
#include<bits/stdc++.h>
using namespace std;
const int maxn=2000010;
const int mo=1000000007;
const int inf=0x7f7f7f7f;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
mt19937 myr(time(0));
int n,m,a[maxn],b[maxn],minsort=inf;
char op[20];
inline int _min(int a,int b){
return a>b?b:a;
}
inline int _abs(int a){
return a>0?a:-a;
}
struct fhq{
int tot,rt;
int ls[maxn],rs[maxn],v[maxn],rnd[maxn],siz[maxn];
void up(int x){
siz[x]=siz[ls[x]]+siz[rs[x]]+1;
return ;
}
int newn(int x){
v[++tot]=x;
siz[tot]=1;
rnd[tot]=myr();
ls[tot]=rs[tot]=0;
return tot;
}
void split(int p,int vv,int &x,int &y){
if(!p){
x=y=0;
return ;
}
if(vv>=v[p]){
x=p;
split(rs[p],vv,rs[p],y);
}
else{
y=p;
split(ls[p],vv,x,ls[p]);
}
up(p);
return ;
}
int merge(int x,int y){
if(!x||!y)
return x+y;
if(rnd[x]>rnd[y]){
rs[x]=merge(rs[x],y);
up(x);
return x;
}
ls[y]=merge(x,ls[y]);
up(y);
return y;
}
void insert(int vv){
int x,y;
split(rt,vv-1,x,y);
rt=merge(merge(x,newn(vv)),y);
return ;
}
void del(int vv){
int x,y,z;
split(rt,vv,x,z);
split(x,vv-1,x,y);
if(y)
y=merge(ls[y],rs[y]);
rt=merge(merge(x,y),z);
return ;
}
int kth(int x,int now){
while(1){
if(siz[ls[now]]+1==x)
return v[now];
else if(siz[ls[now]]+1>x)
now=ls[now];
else{
x-=siz[ls[now]]+1;
now=rs[now];
}
}
}
int lower(int vv){
int x,y,z,ans=-1;
split(rt,vv,x,z);
split(x,vv-1,x,y);
if(siz[y]>1)
ans=vv;
else if(x)
ans=kth(siz[x],x);
rt=merge(merge(x,y),z);
return ans;
}
int upper(int vv){
int x,y,ans=-1;
split(rt,vv,x,y);
if(y)
ans=kth(1,y);
rt=merge(x,y);
return ans;
}
int sum(){
return siz[rt];
}
}t1,t2;
signed main(){
n=read();
m=read();
for(int i=1;i<=n;i++){
a[i]=read();
b[i]=a[i];
if(i!=1)
t1.insert(_abs(a[i]-a[i-1]));
t2.insert(a[i]);
}
for(int i=1;i<=n;i++){
int low=t2.lower(a[i]),up=t2.upper(a[i]);
minsort=_min(minsort,_min(up==-1?inf:_abs(up-a[i]),low==-1?inf:_abs(a[i]-low)));
}
while(m--){
scanf("%s",op);
if(op[0]=='I'){
int i=read(),k=read();
if(i!=n){
t1.del(_abs(b[i]-a[i+1]));
t1.insert(_abs(k-a[i+1]));
}
t1.insert(_abs(k-b[i]));
b[i]=k;
t2.insert(k);
int low=t2.lower(k),up=t2.upper(k);
minsort=_min(minsort,_min(up==-1?inf:_abs(up-k),low==-1?inf:_abs(k-low)));
}
else if(op[4]=='G')
printf("%d\n",t1.kth(1,t1.rt));
else
printf("%d\n",minsort);
}
return 0;
}