rt,求一个好心人证伪或者说明哪里常数过大
寄宿学校今天要去睡觉了
#include<bits/stdc++.h>
using namespace std;
const int MAXN=5000005,N=5e5+5;
int read()
{
int r=0,f=1; char c;
while(!isdigit(c=getchar())) f^=(c=='-');
while(isdigit(c))
{
r=(r<<1)+(r<<3)+c-48;
c=getchar();
}
return f?r:-r;
}
int n,m,a[N],rt,rubbish;
int siz[MAXN],rnd[MAXN],val[MAXN],sum[MAXN],lmax[MAXN],rmax[MAXN],maxx[MAXN],laz[MAXN],ch[MAXN][2],tot;
bool op[MAXN];
void pushup(int p)
{
siz[p]=siz[ch[p][0]]+siz[ch[p][1]]+1;
sum[p]=sum[ch[p][0]]+sum[ch[p][1]]+val[p];
lmax[p]=max(lmax[ch[p][0]],max(sum[ch[p][0]]+val[p]+lmax[ch[p][1]],sum[ch[p][0]]+val[p]));
rmax[p]=max(rmax[ch[p][1]],max(sum[ch[p][1]]+val[p]+rmax[ch[p][0]],sum[ch[p][1]]+val[p]));
maxx[p]=max(max(maxx[ch[p][0]],maxx[ch[p][1]]),max(rmax[ch[p][0]]+val[p]+lmax[ch[p][1]],max(rmax[ch[p][0]]+val[p],lmax[ch[p][1]]+val[p])));
}
void pushdown(int p)
{
if(laz[p]!=-1001)
{
if(ch[p][0])
{
val[ch[p][0]]=laz[p];
sum[ch[p][0]]=siz[ch[p][0]]*laz[p];
if(laz[p]<0) maxx[ch[p][0]]=lmax[ch[p][0]]=rmax[ch[p][0]]=laz[p];
else maxx[ch[p][0]]=lmax[ch[p][0]]=rmax[ch[p][0]]=sum[ch[p][0]];
laz[ch[p][0]]=laz[p];
// op[ch[p][0]]=0;
}
if(ch[p][1])
{
val[ch[p][1]]=laz[p];
sum[ch[p][1]]=siz[ch[p][1]]*laz[p];
if(laz[p]<0) maxx[ch[p][1]]=lmax[ch[p][1]]=rmax[ch[p][1]]=laz[p];
else maxx[ch[p][1]]=lmax[ch[p][1]]=rmax[ch[p][1]]=sum[ch[p][1]];
laz[ch[p][1]]=laz[p];
// op[ch[p][1]]=0;
}
laz[p]=-1001;
}
if(op[p])
{
if(ch[p][0])
{
swap(ch[ch[p][0]][0],ch[ch[p][0]][1]),op[ch[p][0]]^=1;
swap(lmax[ch[p][0]],rmax[ch[p][0]]);
}
if(ch[p][1])
{
swap(ch[ch[p][1]][0],ch[ch[p][1]][1]),op[ch[p][1]]^=1;
swap(lmax[ch[p][1]],rmax[ch[p][1]]);
}
op[p]=0;
}
}
int merge(int x,int y)
{
if(!x||!y) return x|y;
if(rnd[x]>rnd[y])
{
pushdown(x);
ch[x][1]=merge(ch[x][1],y);
pushup(x);
return x;
}
else
{
pushdown(y);
ch[y][0]=merge(x,ch[y][0]);
pushup(y);
return y;
}
}
void split(int p,int k,int &l,int &r)
{
if(!p) return l=r=0,void();
pushdown(p);
if(siz[ch[p][0]]+1<=k)
{
l=p;
split(ch[p][1],k-siz[ch[p][0]]-1,ch[p][1],r);
}
else
{
r=p;
split(ch[p][0],k,l,ch[p][0]);
}
pushup(p);
}
void clear(int x)
{
siz[x]=ch[x][0]=ch[x][1]=rnd[x]=val[x]=sum[x]=op[x];
lmax[x]=rmax[x]=maxx[x]=-1e9;
laz[x]=-1001;
}
int newnode(int x)
{
int id=++tot;
// if(!rubbish) id=++tot;
// else id=rubbish,rubbish=merge(ch[rubbish][0],ch[rubbish][1]);
// clear(id);
siz[id]=1,rnd[id]=rand(),val[id]=sum[id]=lmax[id]=rmax[id]=maxx[id]=x;
return id;
}
int build(int l,int r)
{
if(l>r) return 0;
int mid=(l+r)>>1;
int p=newnode(a[mid]);
ch[p][0]=build(l,mid-1); ch[p][1]=build(mid+1,r);
pushup(p);
return p;
}
void ins(int x,int w)
{
int l,r;
split(rt,x,l,r);
rt=merge(l,merge(newnode(w),r));
}
void del(int x,int k)
{
int l,r;
split(rt,x-1,rt,l);
split(l,k,l,r);
rubbish=merge(rubbish,l);
rt=merge(rt,r);
}
void upd(int x,int k,int w)
{
int l,r;
split(rt,x-1,rt,l);
split(l,k,l,r);
laz[l]=w;
sum[l]=siz[l]*w;
val[l]=w;
if(w<0) lmax[l]=rmax[l]=maxx[l]=w;
else lmax[l]=rmax[l]=maxx[l]=sum[l];
rt=merge(rt,merge(l,r));
}
void rev(int x,int k)
{
int l,r;
split(rt,x-1,rt,l);
split(l,k,l,r);
op[l]^=1; swap(ch[l][0],ch[l][1]); swap(lmax[l],rmax[l]);
rt=merge(rt,merge(l,r));
}
int ges(int x,int k)
{
int l,r;
split(rt,x-1,rt,l);
split(l,k,l,r);
int ans=sum[l];
rt=merge(rt,merge(l,r));
return ans;
}
void print(int rt)
{
if(!rt) return ;
pushdown(rt);
print(ch[rt][0]);
cout<<val[rt]<<' ';
print(ch[rt][1]);
return ;
}
string s;
int main()
{
fill(laz+1,laz+MAXN,-1001);
maxx[0]=lmax[0]=rmax[0]=-1e9;
n=read(); m=read();
for(int i=1;i<=n;i++) a[i]=read();
rt=build(1,n);
int x,k,w;
while(m--)
{
cin>>s;
if(s=="INSERT")
{
x=read(); k=read();
for(int i=1;i<=k;i++)
ins(x+i-1,read());
}
else if(s=="DELETE")
{
x=read(); k=read();
del(x,k);
}
else if(s=="MAKE-SAME")
{
x=read(); k=read(); w=read();
upd(x,k,w);
}
else if(s=="REVERSE")
{
x=read(); k=read();
rev(x,k);
}
else if(s=="GET-SUM")
{
x=read(); k=read();
printf("%d\n",ges(x,k));
}
else printf("%d\n",maxx[rt]);
}
return 0;
}