记录编号 143860 评测结果 AAAAAAAAAA
题目名称 [NOI 2005]维护数列 最终得分 100
用户昵称 GravatarChenyao2333 是否通过 通过
代码语言 C++ 运行时间 3.170 s
提交时间 2014-12-18 12:11:38 内存使用 34.64 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<cmath>
#define CL(x) memset(x,0,sizeof(x))
#define rep(i,s,t) for(int i=(s);i<=(t);i++)
#define dow(i,s,t) for(int i=(s);i>=(t);i--)
using namespace std;
typedef long long LL;
LL read(){
    LL ret=0,f=1;
    char x=getchar();
    while(!(x>='0' && x<='9')){if(x=='-')f=-1;x=getchar();}
    while(x>='0' && x<='9') ret=ret*10+x-'0', x=getchar();
    return ret*f;
}
char get_char(){
	char x=getchar();
	while(!((x>='a' && x<='z')||(x>='A' && x<='Z'))) x=getchar();
	return x;
}

const int MAXN=5e5+10;
const LL INF=1e16;
const LL ZERO=0;


struct node{
	int ls,rs,fa;
	//子树和 子树大小 点权 该点及其子树到达最右点的最大和 ...左... 此点及其子树的最大和 
	LL sum,sz,val,mx_l,mx_r,mx;
	int lz;
	bool revc,have_lz;
	node(){
		ls=rs=fa=sum=sz=val=mx_l=mx_r=mx=lz=0;
		mx=-INF;
		revc=have_lz=false;
	}
}t[MAXN];
int root=0;
int node_cnt;
int node_queue[MAXN],qn;

int new_node(){
	if(qn) return node_queue[--qn];
	return ++node_cnt;
}
void del_node(int & n){
	t[n]=node();
	node_queue[qn++]=n;
	n=0;
}

void push_up(int n){
	if(!n) return;
	int ls=t[n].ls, rs=t[n].rs;
	t[n].sz=t[ls].sz+t[rs].sz+1;
	t[n].sum=t[ls].sum+t[rs].sum+t[n].val;
	t[n].mx_l=max(max(ZERO,t[ls].mx_l)+t[n].val+t[rs].sum, t[rs].mx_l);
	t[n].mx_r=max(max(ZERO,t[rs].mx_r)+t[n].val+t[ls].sum, t[ls].mx_r);
	t[n].mx=max(t[ls].mx,t[rs].mx);
	t[n].mx=max(t[n].mx,max(t[ls].mx_l,ZERO)+t[n].val+max(t[rs].mx_r,ZERO));
}
void node_same(int n,int val){
	if(!n) return;
	t[n].val=val;
	t[n].sum=t[n].sz*val;
	if(val>=0) t[n].mx_l=t[n].mx_r=t[n].mx=t[n].sum;
	else       t[n].mx_l=t[n].mx_r=t[n].mx=val;
	t[n].lz=val;
	t[n].have_lz=true;
}
void node_revc(int n){
	if(!n) return;
	swap(t[n].ls,t[n].rs);
	swap(t[n].mx_l,t[n].mx_r);
	t[n].revc^=true;
}
void push_down(int n){
	if(!n) return ;
	int ls=t[n].ls, rs=t[n].rs;
	if(t[n].have_lz){
		node_same(t[n].ls,t[n].lz);
		node_same(t[n].rs,t[n].lz);
		t[n].lz=0;
		t[n].have_lz=false;
	}
	if(t[n].revc){
		node_revc(t[n].ls);
		node_revc(t[n].rs);
		t[n].revc=false;
	}
}

void zig(int x){
	int y=t[x].fa, z=t[y].fa;
	if(t[z].ls==y) t[z].ls=x;
	if(t[z].rs==y) t[z].rs=x;
	t[x].fa=z;
	t[y].ls=t[x].rs, t[t[x].rs].fa=y;
	t[x].rs=y, t[y].fa=x;
	push_up(y);
}
void zag(int x){
	int y=t[x].fa, z=t[y].fa;
	if(t[z].ls==y) t[z].ls=x;
	if(t[z].rs==y) t[z].rs=x;
	t[x].fa=z;
	t[y].rs=t[x].ls, t[t[x].ls].fa=y;
	t[x].ls=y, t[y].fa=x;
	push_up(y);
}
void splay(int n,int g=0){
	int x=n;
	push_down(x);
	while(t[x].fa!=g){
		int y=t[x].fa, z=t[y].fa;
		push_down(z), push_down(y), push_down(x);
		if(z==g){
			if(t[y].ls==x) zig(x);
			else zag(x);
			break;
		}else if(t[z].ls==y){
			if(t[y].ls==x) zig(y),zig(x);
			else zag(x),zig(x);
		}else{
			if(t[y].rs==x) zag(y),zag(x);
			else zig(x),zag(x);
		}
	}
	push_up(x);
	if(t[x].fa==0) root=x;
}
void dfs_print(int n){
	push_down(n);
	if(t[n].ls) dfs_print(t[n].ls);
	printf("%d ",t[n].val);
	if(t[n].rs) dfs_print(t[n].rs);
}
int find(int n,int sz){
	push_down(n);
	int ls=t[n].ls, rs=t[n].rs;
	if(sz<=t[ls].sz) return find(ls,sz);
	sz-=t[ls].sz;
	if(sz==1) return n;
	else return find(rs,sz-1);
}
int ins(int & n,int fa,LL val){
	push_down(n);
	if(!n){
		n=new_node();
		t[n].fa=fa;
		t[n].sz=1;
		t[n].val=t[n].sum=t[n].mx_l=t[n].mx_r=t[n].mx=val;
		return n;
	}
	int tn=ins(t[n].ls,n,val);
	push_up(n);
	return tn;
}
int build(int l,int r,vector<int> & ps){
	if(l>r) return 0;
	int mid=(l+r)/2;
	int n=new_node();
	t[n].val=t[n].sum=t[n].mx_l=t[n].mx_r=t[n].mx=ps[mid];
	t[n].sz=1;
	if(l==r) return n;
	t[n].ls=build(l,mid-1,ps); t[t[n].ls].fa=n;
	t[n].rs=build(mid+1,r,ps); t[t[n].rs].fa=n;
	push_up(n);
	return n;
}
void ins_node(int & n,int fa,int tn){
	push_down(n);
	if(!n){
		n=tn;
		t[n].fa=fa;
		return;
	}
	ins_node(t[n].ls,n,tn);
	push_up(n);
}
void insert(int p,vector<int> & ps){
	int n=find(root,p+1);
	int tn=build(0,(int)ps.size()-1,ps);
	splay(n);
	push_down(t[n].rs);
	ins_node(t[n].rs,n,tn);
	push_up(t[n].rs);
	push_up(root);
	//dfs_print(root);
	//printf("\n");
}
void del(int & n){
	if(!n) return;
	if(t[n].ls) del(t[n].ls);
	if(t[n].rs) del(t[n].rs);
	del_node(n);
}
void remove(int p,int tot){
	int sn=find(root,p);
	int en=find(root,p+tot+1);
	splay(sn);
	splay(en,sn);
	del(t[en].ls);
	push_up(en);
	push_up(sn);
}
void make_same(int p,int tot,int val){
	int sn=find(root,p);
	int en=find(root,p+tot+1);
	splay(sn);
	splay(en,sn);
	node_same(t[en].ls,val);
	push_down(t[en].ls);
	push_up(en);
	push_up(sn);
}
void reverse(int p,int tot){
	int sn=find(root,p);
	int en=find(root,p+tot+1);
	splay(sn);
	splay(en,sn);
	node_revc(t[en].ls);
	push_down(t[en].ls);
	push_up(en);
	push_up(sn);
}
LL get_sum(int p,int tot){
	int sn=find(root,p);
	int en=find(root,p+tot+1);
	splay(sn);
	splay(en,sn);
	return t[t[en].ls].sum;
}

int N,M;

void init(){
	ins(root,0,-INF);
	ins(root,0,-INF);
	N=read(), M=read();
	vector<int> val;
	rep(i,1,N) val.push_back(read());
	insert(0,val);
}
bool equal(char s1[],const char s2[]){
	rep(i,0,2) if(s1[i]!=s2[i]) return false;
	return true;
}

void work(){
	rep(i,1,M){
		char str[20]={0};
		scanf("%s",&str);
		if(equal(str,"INS")){
			int p=read(), tot=read();
			vector<int> val;
			rep(j,1,tot) val.push_back(read());
			insert(p,val);
		}else if(equal(str,"DEL")){
			int p=read(), tot=read();
			remove(p,tot); 
		}else if(equal(str,"MAK")){
			int p=read(), tot=read(), val=read();
			make_same(p,tot,val);
		}else if(equal(str,"REV")){
			int p=read(), tot=read();
			reverse(p,tot);
		}else if(equal(str,"GET")){
			int p=read(), tot=read();
			LL sum=get_sum(p,tot);
			printf("%lld\n",sum);
		}else{
			splay(root);
			LL mx=t[root].mx;
			printf("%lld\n",mx);
		}
		//dfs_print(root);
		//printf("\n");
	}
}

int main(){
	//freopen("in.txt","r",stdin);
	//freopen("1.out","w",stdout); 
	freopen("seq2005.in","r",stdin);
	freopen("seq2005.out","w",stdout); 
	init();
	work();
	return 0;
}