rt,不启用回收空间pt30,只有#3WA,其他RE/MLE
但现在除了样例全WA没搞懂什么意思
#include<bits/stdc++.h>
#define mmt(a,b) memset(a,b,sizeof(a))
#define test(x) cout<<#x<<" = "<<x<<endl
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout)
#define endl '\n'
#define enter putchar(endl)
//#define int long long
using namespace std;
inline void read(int &x);
inline void ffout(int x);
inline void ffout(string b);
inline void ffout(int x,char b);
inline void ffout(int x,string b);
inline void print(string name,int a[],int r);
const int inf=0x3f3f3f3f,N=5e5+10,maxn = 4e6 + 5;
int n,m, nd_top, root, cnt;
int nodeless[N], num[N];
struct fhq_treap
{
int l,r , val, rnd, sizet, cov_val, sum, mpre, msuf, msum;
bool rev_tag, cov_tag;
}tr[N];
#define ls tr[k].l
#define rs tr[k].r
int push_node(int x)
{
// int i = nd_top ? nodeless[nd_top--] : ++cnt;
int i = ++cnt;
tr[i].l = tr[i].r = 0;
tr[i].msum = tr[i].sum = tr[i].val = x;
tr[i].mpre = tr[i].msuf = max(x,0);
tr[i].sizet = 1; tr[i].rnd = rand();
return i;
}
void node_out(int k)
{
if(!k)return;
nodeless[++nd_top] = k;
node_out(ls); node_out(rs);
}
void pushup(int k)
{
if(!k)return;
tr[k].sum = tr[ls].sum + tr[rs].sum + tr[k].val;
tr[k].sizet = tr[ls].sizet + tr[rs].sizet + 1;
tr[k].mpre = max({ tr[ls].mpre, tr[ls].sum + tr[k].val + tr[rs].mpre, 0 });
tr[k].msuf = max({ tr[rs].msuf, tr[ls].msuf + tr[k].val + tr[rs].sum, 0 });
tr[k].msum = max({ tr[ls].msum, tr[rs].msum, tr[k].val, tr[ls].msuf + tr[k].val + tr[rs].mpre, 0});
}
void down_tagc(int k)
{
if(!tr[k].cov_tag) return;
int t = tr[k].val = tr[k].cov_val;
int s = tr[k].sum = t * tr[k].sizet;
tr[k].mpre = tr[k].msuf = max(0,s);
tr[k].msum = max(t,s);
if(ls)tr[ls].cov_tag = true, tr[ls].cov_val = t;
if(rs)tr[rs].cov_tag = true, tr[rs].cov_val = t;
tr[k].cov_tag = false; tr[k].cov_val = 0;
}
void down_tagr(int k)
{
if(!tr[k].rev_tag) return;
swap(ls,rs);
swap(tr[k].mpre, tr[k].msuf);
if(ls)tr[ls].rev_tag ^= 1;
if(rs)tr[rs].rev_tag ^= 1;
tr[k].rev_tag = false;
}
void pushdown(int k)
{
if(!k)return;
down_tagr(k); down_tagr(ls); down_tagr(rs);
down_tagc(k); down_tagc(ls); down_tagc(rs);
}
void split(int k, int x, int &l, int &r)
{
if(!k)
{
l = r = 0;
return;
}
pushdown(k);
if(tr[ls].sizet < x)
{
l = k;
split(rs, x-tr[ls].sizet-1, rs, r);
}
else
{
r = k;
split(ls, x, l, ls);
}
pushup(k);
}
void split2(int k, int tot, int &x, int &y, int &z)
{
int l = k, r = k + tot - 1;
split(root, r, x, z);
split(x, l-1, x, y);
}
int merge(int x, int y)
{
if(!x || !y) return x+y;
if(tr[x].rnd < tr[y].rnd)
{
pushdown(x);
tr[x].r = merge(tr[x].r, y);
pushup(x);
return x;
}
else
{
pushdown(y);
tr[y].l = merge(x, tr[y].l);
pushup(y);
return y;
}
}
int build(int l, int r)
{
if(l == r) return push_node(num[l]);
int mid = l+r >> 1;
return merge( build(l,mid), build(mid+1,r) );
}
void insert(int k, int tot)
{
int x,y;
split(root, k, x, y);
int z = build(1, tot);
root = merge( merge(x,z), y );
}
void del(int k, int tot)
{
int x,y,z;
split2(k, tot, x, y, z);
node_out(y);
root = merge(x,z);
}
void reverse(int k, int tot)
{
int x,y,z;
split2(k, tot, x, y, z);
tr[y].rev_tag ^= 1;
down_tagr(y);
root = merge(merge(x, y), z);
}
void makesame(int k, int tot, int c)
{
int x,y,z;
split2(k, tot, x, y, z);
tr[y].cov_tag = true;
tr[y].cov_val = c;
down_tagc(y);
root = merge(merge(x, y), z);
}
int getsum(int k, int tot)
{
int x,y,z;
split2(k, tot, x, y, z);
int ans = tr[y].sum;
root = merge(merge(x, y), z);
return ans;
}
void output(int p) {
if (!p) return;
pushdown(p);
output(tr[p].l);
ffout(tr[p].val, ' ');
output(tr[p].r);
}
signed main()
{
int i,j;
// srand(time(0));
read(n);read(m);
for(i=1; i<=n; ++i)
{
int x;
read(x);
root = merge(root, push_node(x) );
}
while(m--)
{
// output(root);
string op;
int k,tot;
cin>>op;
if(op == "INSERT")
{
// test(op);
read(k);read(tot);
for(i=1; i<=tot; ++i)
read(num[i]);
insert(k, tot);
}
if(op == "DELETE")
{
// test(op);
read(k);read(tot);
del(k, tot);
}
if(op == "MAKE-SAME")
{
// test(op);
int c;
read(k);read(tot);read(c);
makesame(k, tot, c);
}
if(op == "REVERSE")
{
// test(op);
read(k);read(tot);
reverse(k, tot);
}
if(op == "GET-SUM")
{
// test(op);
read(k);read(tot);
ffout(getsum(k, tot), endl);
}
if(op == "MAX-SUM")
ffout(tr[root].msum,endl);
}
return 0;
}
inline void ffout(string b)
{
int len=b.size();
for(int i=0;i<len;++i)putchar(b[i]);
}
inline void read(int &x)
{
int f=1;x=0;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
x=x*f;
}
inline void ffout(int x)
{
if(x<0){x=-x; putchar('-'); }
short sta[63],top=0;
do{ sta[top++]=x%10; x/=10; }while(x);
while(top) putchar(sta[--top]+'0');
}
inline void ffout(int x,char b)
{
if(x<0){x=-x; putchar('-'); }
short sta[63],top=0;
do{ sta[top++]=x%10; x/=10; }while(x);
while(top) putchar(sta[--top]+'0');
putchar(b);
}
inline void ffout(int x,string b)
{
if(x<0){x=-x; putchar('-'); }
short sta[63],top=0;
do{ sta[top++]=x%10; x/=10; }while(x);
while(top) putchar(sta[--top]+'0');
ffout(b);
}
inline void print(string name,int a[],int r)
{
ffout(name);
putchar(':');
for(int i=1;i<=r;i++)
ffout(a[i],' ');
putchar(endl);
}