BZOJ 1500
不想说有多心酸
#include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> using namespace std; typedef long long ll; inline char nc() { static char buf[100000],*p1=buf,*p2=buf; if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; } return *p1++; } inline void read(int &x) { char c=nc(),b=1; for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1; for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b; } inline void read(char *s) { char c=nc(); int len=0; for (;!((c>='A' && c<='Z') || c=='-');c=nc()); for (;(c>='A' && c<='Z') || c=='-';s[++len]=c,c=nc()); s[++len]=0; } struct Splay{ #define oo 1<<30 #define ND_MAX 600005 struct node{ node *p,*ch[2]; int val,size; int fan,H; ll sum,smax,lmax,rmax; bool dir() { return p->ch[1]==this; } void setc(node *x,int d) { ch[d]=x; x->p=this; } void update(){ size=ch[0]->size+ch[1]->size+1; sum=ch[0]->sum+ch[1]->sum+val; smax=max(ch[0]->smax,ch[1]->smax); smax=max(smax,ch[0]->rmax+val+ch[1]->lmax); lmax=max(ch[0]->lmax,ch[0]->sum+val+ch[1]->lmax); rmax=max(ch[1]->rmax,ch[1]->sum+val+ch[0]->rmax); } void pushdown(node *null){ if (fan) { if (ch[0]!=null) ch[0]->fan^=1,swap(ch[0]->ch[0],ch[0]->ch[1]),swap(ch[0]->lmax,ch[0]->rmax); if (ch[1]!=null) ch[1]->fan^=1,swap(ch[1]->ch[0],ch[1]->ch[1]),swap(ch[1]->lmax,ch[1]->rmax); fan=0; } if (H!=10000) { if (ch[0]!=null) ch[0]->H=ch[0]->val=H,ch[0]->sum=ch[0]->size*H; if (ch[1]!=null) ch[1]->H=ch[1]->val=H,ch[1]->sum=ch[1]->size*H; if (H>0) { if (ch[0]!=null) ch[0]->smax=ch[0]->lmax=ch[0]->rmax=ch[0]->sum; if (ch[1]!=null) ch[1]->smax=ch[1]->lmax=ch[1]->rmax=ch[1]->sum; } else { if (ch[0]!=null) ch[0]->smax=ch[0]->H,ch[0]->lmax=ch[0]->rmax=0; if (ch[1]!=null) ch[1]->smax=ch[1]->H,ch[1]->lmax=ch[1]->rmax=0; } H=10000; } } }*root,*null; node Mem[ND_MAX],*Stack[ND_MAX]; int top; inline node *init_Memory(){ for (int i=0;i<ND_MAX;i++) Stack[i]=Mem+i; top=ND_MAX-1; return Stack[top--]; } inline node *New_Node(int key){ node *p=Stack[top--]; p->p=p->ch[0]=p->ch[1]=null; p->size=1; p->val=key; p->fan=0; p->H=10000; p->sum=p->smax=key; if (key>0) p->lmax=p->rmax=key; else p->lmax=p->rmax=0; return p; } inline void Del_Node(node *x){ Stack[++top]=x; } Splay(){ null=init_Memory(); null->p=null->ch[0]=null->ch[1]=null; null->size=0; null->sum=0; null->smax=-oo; null->lmax=null->rmax=0; root=null; } inline void clear(node *x) { if (x==null) return; if (x==root) root=null; clear(x->ch[0]); clear(x->ch[1]); if (x->p!=null) x->p->ch[x->dir()]=null,x->p->update(); Del_Node(x); } inline void rot(node *x){ if (x==null) return; if (x->p==root) root=x; bool d=x->dir(); node *p=x->p; if (p->p!=null) p->p->setc(x,p->dir()); else x->p=null; p->setc(x->ch[d^1],d); x->setc(p,d^1); p->update(); x->update(); } inline void Pushdown(node *x){ if (x->p!=null) Pushdown(x->p); x->pushdown(null); } inline void splay(node *&rt,node *x){ if (x==null) return; Pushdown(x); while (x!=rt) if (x->p==rt) rot(x); else x->dir()==x->p->dir()?(rot(x->p),rot(x)):(rot(x),rot(x)); // x->update(); } inline node *build(int *a,int l,int r){ int mid=(l+r)>>1; node *p=New_Node(a[mid]); if (l<=mid-1) p->setc(build(a,l,mid-1),0); if (mid+1<=r) p->setc(build(a,mid+1,r),1); p->update(); return p; } inline node *findkth(node *rt,int k){ if (rt->size<k) return null; node *x=rt; while (k) { x->pushdown(null); if (x->ch[0]->size+1==k) break; else x->ch[0]->size+1<k?(k-=x->ch[0]->size+1,x=x->ch[1]):x=x->ch[0]; } splay(root,x); return x; } inline void print(node *x){ if (x==null) return; // x->pushdown(null); if (x->fan) printf("*"); if (x->H!=10000) printf("[%d]",x->H); if (x->val==-oo) printf("-oo"); else printf("%d",x->val); putchar('('); print(x->ch[0]); putchar(')'); putchar('('); print(x->ch[1]); putchar(')'); } }splay; int n,m; int a[500005]; int main() { char ch[15]; Splay::node *t1,*t2,*t; int l,r,c,_n; freopen("t.in","r",stdin); freopen("t.out","w",stdout); read(n); read(m); for (int i=1;i<=n;i++) read(a[i]); a[0]=-1<<30; a[++n]=-1<<30; splay.root=splay.build(a,0,n); n--; // splay.print(splay.root); printf("\n"); while (m--) { read(ch); if (!strcmp(ch+1,"INSERT")) { read(l); l++; r=l+1; read(_n); n+=_n; for (int i=1;i<=_n;i++) read(a[i]); t1=splay.findkth(splay.root,l); t2=splay.findkth(splay.root,r); splay.splay(splay.root,t1); splay.splay(splay.root->ch[1],t2); // splay.print(splay.root); printf("\n"); t=splay.root->ch[1]; t->setc(splay.build(a,1,_n),0); splay.root->ch[1]->update(); splay.root->update(); // splay.print(splay.root); printf("\n"); } else if (!strcmp(ch+1,"DELETE")) { read(l); read(r); n-=r; r=l+r+1; t1=splay.findkth(splay.root,l); t2=splay.findkth(splay.root,r); splay.splay(splay.root,t1); splay.splay(splay.root->ch[1],t2); // splay.print(splay.root); printf("\n"); t=splay.root->ch[1]->ch[0]; splay.clear(t); splay.root->ch[1]->update(); splay.root->update(); // splay.print(splay.root); printf("\n"); } else if (!strcmp(ch+1,"MAKE-SAME")) { read(l); read(r); r=l+r+1; read(c); t1=splay.findkth(splay.root,l); t2=splay.findkth(splay.root,r); splay.splay(splay.root,t1); splay.splay(splay.root->ch[1],t2); // splay.print(splay.root); printf("\n"); t=splay.root->ch[1]->ch[0]; t->H=t->val=c; t->sum=t->size*c; if (c>0) t->smax=t->lmax=t->rmax=t->sum; else t->smax=t->H,t->lmax=t->rmax=0; splay.root->ch[1]->update(); splay.root->update(); // splay.print(splay.root); printf("\n"); } else if (!strcmp(ch+1,"REVERSE")) { read(l); read(r); r=l+r+1; t1=splay.findkth(splay.root,l); t2=splay.findkth(splay.root,r); splay.splay(splay.root,t1); splay.splay(splay.root->ch[1],t2); // splay.print(splay.root); printf("\n"); t=splay.root->ch[1]->ch[0]; t->fan^=1; swap(t->ch[0],t->ch[1]); swap(t->lmax,t->rmax); splay.root->ch[1]->update(); splay.root->update(); // splay.print(splay.root); printf("\n"); } else if (!strcmp(ch+1,"GET-SUM")) { read(l); read(r); r=l+r+1; t1=splay.findkth(splay.root,l); t2=splay.findkth(splay.root,r); splay.splay(splay.root,t1); splay.splay(splay.root->ch[1],t2); // splay.print(splay.root); printf("\n"); t=splay.root->ch[1]->ch[0]; printf("%lld\n",t->sum); } else if (!strcmp(ch+1,"MAX-SUM")) { printf("%lld\n",splay.root->smax); } } return 0; }