记录编号 431471 评测结果 AAAAAAAAAA
题目名称 地震 最终得分 100
用户昵称 GravatarAnonymity 是否通过 通过
代码语言 C++ 运行时间 2.013 s
提交时间 2017-07-31 20:16:47 内存使用 0.32 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#define lch ch[0]
#define rch ch[1]
#define kch ch[k]
#define xch ch[k^1]
using namespace std;
inline int read()
{	char c=getchar();int x=0,y=1;
	while(c<'0'||c>'9'){if(c=='-') y=-1;c=getchar();}
	while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
	return x*y;
}
int inf=0x7fffffff,n,q;
class splay
{	private:
		struct node
		{	int k,s,h,lazy;
			node* pt,*ch[2];
			node(const int& key)
			{	this->k=key;this->s=1;this->lazy=0;
				this->lch=NULL;this->rch=NULL;
			}
			inline int sz(){return this?this->s:0;}
			inline int key(){return this?this->k:0;}
			inline int qh(){return this?this->h:-inf;}
			~node()
			{	if(this->lch) delete this->lch;
				if(this->rch) delete this->rch; 
			}
			inline void mt()
			{	if(this) this->s=this->lch->sz()+this->rch->sz()+1;
				if(this) this->h=std::max(this->k,max(this->lch->qh(),this->rch->qh()));
			}
			inline void dn()
			{	if(this&&this->lazy)
				{	if(lch) lch->lazy+=lazy,lch->k+=lazy,lch->h+=lazy;
					if(rch) rch->lazy+=lazy,rch->k+=lazy,rch->h+=lazy;
					lazy=0;
				}
			}
			inline void Ad(int key){if(this){this->lazy+=key;this->k+=key;this->h+=key;}}
			inline int pos(){return this==this->pt->lch;}
		}*root;
		void rotate(node* rt,int k)
		{	node* tmp=rt->xch;
			rt->dn();tmp->dn();
			tmp->pt=rt->pt;
			if(!rt->pt) this->root=tmp;
			else if(rt->pt->lch==rt) rt->pt->lch=tmp;
			else rt->pt->rch=tmp;
			rt->xch=tmp->kch;
			if(tmp->kch) tmp->kch->pt=rt;
			tmp->kch=rt;rt->pt=tmp;
			rt->mt();tmp->mt();
		}
		void sp(node* rt,node* prt=NULL)
		{	while(rt->pt!=prt)
			{	int k=rt->pt->lch==rt;
				if(rt->pt->pt==prt) rotate(rt->pt,k);
				else
				{	int d=rt->pt->pt->lch==rt->pt;
					rotate(k==d?rt->pt->pt:rt->pt,k);
					rotate(rt->pt,d);
				}
			}
		}
		node* build(const std::vector<int>& v,int l,int r)
		{	if(l>r) return NULL;
			int mid=(l+r)>>1;node* tmp=new node(v[mid]);
			tmp->lch=build(v,l,mid-1);tmp->rch=build(v,mid+1,r);
			if(tmp->lch) tmp->lch->pt=tmp; if(tmp->rch) tmp->rch->pt=tmp;
			tmp->mt();
			return tmp;
		}
	public:
		~splay(){delete this->root;}
		splay(const std::vector<int>& v){this->root=build(v,0,v.size()-1);}
		splay(){this->root=new node(-inf);this->root->rch=new node(-inf);this->root->rch->pt=this->root;}
		node* kth(int x)
		{	++x;
			node* now=this->root;
			while(now!=NULL)
			{	now->dn();
				int k=now->lch->sz()+1;
				if(x<k) now=now->lch;
				else if(x==k) return now;
				else x-=k,now=now->rch;
			}
			return NULL;
		}
		void add(int x,int y,int z)
		{	node* tmp=this->kth(y+1),*tmp2=this->kth(x-1);
			this->sp(tmp2);this->sp(tmp,this->root);
			this->root->rch->lch->Ad(z);
			this->root->rch->mt();this->root->mt();
		}
		void del(int x,int y)
		{	node* tmp=this->kth(y+1),*tmp2=this->kth(x-1);
			this->sp(tmp2);this->sp(tmp,this->root);
			delete this->root->rch->lch;
			this->root->rch->lch=NULL;
			this->root->rch->mt();this->root->mt();
		}
		int hmax(int x,int y)
		{	node* tmp=this->kth(y+1),*tmp2=this->kth(x-1);
			this->sp(tmp2);this->sp(tmp,this->root);
			return this->root->rch->lch->h;
		}
		void insert(int x,splay* data)
		{	this->sp(this->kth(x));this->sp(this->kth(x+1),this->root);
			node* tmp=data->root;data->root=NULL;
			this->root->rch->lch=tmp;tmp->pt=this->root->rch;
			this->root->rch->mt();this->root->mt();
		}
};
int main()
{	freopen("equake.in","r",stdin);
	freopen("equake.out","w",stdout);
	n=read();q=read();
	splay* tree=new splay();
	std::vector<int>v;char ord[10];int x,y,z;
	for(int i=1;i<=n;i++) v.push_back(read());
	tree->insert(0,new splay(v));
	for(int i=1;i<=q;i++)
	{	scanf("%s",ord);
		if(ord[0]=='R'){x=read();y=read();z=read();tree->add(x,y,z);}
		if(ord[0]=='I')
		{	v.clear();x=read();y=read();
			while(y--) v.push_back(read());
			tree->insert(x,new splay(v));
		}
		if(ord[0]=='M'){x=read();y=read();tree->del(x,y);}
		if(ord[0]=='Q'){x=read();y=read();printf("%d\n",tree->hmax(x,y));}
	}
	return 0;
}