代码十分的简单。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
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 gn(int key)
{
tr[++idx].ky=key;
tr[idx].val=rand();
tr[idx].sum=tr[idx].mx=key;
tr[idx].sa=1001;
tr[idx].ls=tr[idx].rs=max(0ll,key);
tr[idx].siz=1;
return idx;
}
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[p].ls,max(0ll,tr[tr[p].l].sum+ tr[p].ky+tr[tr[p].r].ls));
tr[p].rs=max(tr[p].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);
tr[p].mx=max(tr[p].mx,tr[tr[p].l].mx);
tr[p].mx=max(tr[p].mx,tr[tr[p].r].mx);
}
void pd(int p)
{
if(tr[p].sa!=1001)
{
tr[tr[p].l].sa=tr[tr[p].r].sa=tr[p].sa;
tr[p].ky=tr[p].sa;
tr[p].sum=tr[p].sa*tr[p].siz;
tr[p].ls=tr[p].rs=max(0ll,tr[p].sum);
tr[p].mx=max(tr[p].mx,tr[p].sa);
tr[p].sa=1001;
}
if(tr[p].rev)
{
tr[tr[p].l].rev^=1;
tr[tr[p].r].rev^=1;
swap(tr[p].l,tr[p].r);
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 del(int l,int r)
{
int x,y,z;
split(rt,l-1,x,y);
split(y,r,y,z);
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;
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].sa=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);
printf("%lld\n",tr[y].sum);
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);
printf("%lld\n",tr[z].ky);
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);
printf("%lld\n",tr[y].mx);
rt=merge(merge(x,y),z);
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
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,x+y-1);
}
else if(op=="REVERSE")
{
int x,y;
cin>>x>>y;
rev(x,x+y-1);
}
else if(op=="MAKE-SAME")
{
int x,y,z;
cin>>x>>y>>z;
upd(x,x+y-1,z);
}
else if(op=="GET-SUM")
{
int x,y;
cin>>x>>y;
query_sum(x,x+y-1);
}
else if(op=="GET")
{
int x;
cin>>x;
get(x);
}
else
{
int x,y;
cin>>x>>y;
query_max(x,x+y-1);
}
}
return 0;
}