下载数据后本地fc没有差异,在洛谷上wa #17
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+5,inf=1e18;
int n,m,a[N];
struct fhq{
int l,r,ls,rs,mx,sum,val,ky,siz,rev,sa;
}tr[N];
int rt,idx;
int st[N],top;
int gn(int key)
{
int now=top?st[top--]:++idx;
tr[now].l=tr[now].r=tr[now].rev=0;
tr[now].val=rand();
tr[now].ky=tr[now].sum=tr[now].mx=key;
tr[now].sa=inf;
tr[now].ls=tr[now].rs=max(0ll,key);
tr[now].siz=1;
return now;
}
void pu(int p)
{
tr[p].siz=tr[tr[p].l].siz+tr[tr[p].r].siz+1;
tr[p].sum=tr[tr[p].l].sum+tr[tr[p].r].sum+tr[p].ky;
tr[p].ls=max(tr[tr[p].l].ls,max(0ll,tr[tr[p].l].sum+tr[p].ky+tr[tr[p].r].ls));
tr[p].rs=max(tr[tr[p].r].rs,max(0ll,tr[tr[p].r].sum+tr[p].ky+tr[tr[p].l].rs));
tr[p].mx=max(tr[p].ky,tr[tr[p].r].ls+tr[tr[p].l].rs+tr[p].ky);
if(tr[p].l)
tr[p].mx=max(tr[p].mx,tr[tr[p].l].mx);
if(tr[p].r)
tr[p].mx=max(tr[p].mx,tr[tr[p].r].mx);
}
void pd(int p)
{
if(tr[p].sa!=inf)
{
if(tr[p].l)
{
tr[tr[p].l].ky=tr[tr[p].l].sa=tr[p].sa;
tr[tr[p].l].sum=tr[tr[p].l].siz*tr[p].sa;
tr[tr[p].l].ls=tr[tr[p].l].rs=max(0ll,tr[tr[p].l].sum);
tr[tr[p].l].mx=max(tr[tr[p].l].sum,tr[p].sa);
}
if(tr[p].r)
{
tr[tr[p].r].ky=tr[tr[p].r].sa=tr[p].sa;
tr[tr[p].r].sum=tr[tr[p].r].siz*tr[p].sa;
tr[tr[p].r].ls=tr[tr[p].r].rs=max(0ll,tr[tr[p].r].sum);
tr[tr[p].r].mx=max(tr[tr[p].r].sum,tr[p].sa);
}
tr[p].sa=inf;
}
if(tr[p].rev)
{
if(tr[p].l)
{
tr[tr[p].l].rev^=1;
swap(tr[tr[p].l].l,tr[tr[p].l].r);
swap(tr[tr[p].l].ls,tr[tr[p].l].rs);
}
if(tr[p].r)
{
tr[tr[p].r].rev^=1;
swap(tr[tr[p].r].l,tr[tr[p].r].r);
swap(tr[tr[p].r].ls,tr[tr[p].r].rs);
}
tr[p].rev=0;
}
}
void split(int p,int k,int& x,int& y)
{
if(!p)
{
x=y=0;
return;
}
pd(p);
if(tr[tr[p].l].siz<k)
x=p,split(tr[p].r,k-tr[tr[p].l].siz-1,tr[p].r,y);
else
y=p,split(tr[p].l,k,x,tr[y].l);
pu(p);
}
int merge(int x,int y)
{
if(!x || !y)
return x+y;
if(tr[x].val>tr[y].val)
{
pd(x);
tr[x].r=merge(tr[x].r,y);
pu(x);
return x;
}
else
{
pd(y);
tr[y].l=merge(x,tr[y].l);
pu(y);
return y;
}
}
string op;
int build(int l,int r)
{
if(l==r)
return gn(a[l]);
int mid=l+r>>1;
int x=build(l,mid),y=build(mid+1,r);
return merge(x,y);
}
void insert(int pos,int k)
{
int x,y;
split(rt,pos,x,y);
rt=merge(merge(x,build(1,k)),y);
}
void dl(int p)
{
if(tr[p].l)
dl(tr[p].l);
if(tr[p].r)
dl(tr[p].r);
st[++top]=p;
}
void del(int l,int r)
{
int x,y,z;
split(rt,l-1,x,y);
split(y,r,y,z);
dl(y);
rt=merge(x,z);
}
void rev(int l,int r)
{
int x,y,z;
split(rt,l-1,x,y);
split(y,r,y,z);
tr[y].rev^=1;
swap(tr[y].l,tr[y].r);
swap(tr[y].ls,tr[y].rs);
rt=merge(merge(x,y),z);
}
void upd(int l,int r,int vl)
{
int x,y,z;
split(rt,l-1,x,y);
split(y,r,y,z);
tr[y].ky=tr[y].sa=vl;
tr[y].sum=tr[y].siz*vl;
tr[y].ls=tr[y].rs=max(0ll,tr[y].sum);
tr[y].mx=max(tr[y].mx,vl);
rt=merge(merge(x,y),z);
}
void query_sum(int l,int r)
{
int x,y,z;
split(rt,l-1,x,y);
split(y,r,y,z);
cout<<tr[y].sum<<'\n';
rt=merge(merge(x,y),z);
}
void get(int pos)
{
int x,y,z;
split(rt,pos,x,y);
split(x,pos-1,x,z);
cout<<tr[z].ky<<'\n';
rt=merge(merge(x,z),y);
}
void query_max(int l,int r)
{
int x,y,z;
split(rt,l-1,x,y);
split(y,r,y,z);
cout<<tr[y].mx<<'\n';
rt=merge(merge(x,y),z);
}
signed main()
{
// freopen("P2710.in","r",stdin);
// freopen("my.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
rt=build(1,n);
while(m--)
{
cin>>op;
if(op=="INSERT")
{
int x,k;
cin>>x>>k;
for(int i=1;i<=k;i++)
cin>>a[i];
insert(x,k);
}
else if(op=="DELETE")
{
int x,y;
cin>>x>>y;
del(x,y);
}
else if(op=="REVERSE")
{
int x,y;
cin>>x>>y;
rev(x,y);
}
else if(op=="MAKE-SAME")
{
int x,y,z;
cin>>x>>y>>z;
upd(x,y,z);
}
else if(op=="GET-SUM")
{
int x,y;
cin>>x>>y;
query_sum(x,y);
}
else if(op=="GET")
{
int x;
cin>>x;
get(x);
}
else
{
int x,y;
cin>>x>>y;
query_max(x,y);
}
}
return 0;
}