主席树被卡常求助
查看原帖
主席树被卡常求助
912241
dream_on_screen楼主2024/1/13 14:35
#include <iostream>
using namespace std;
const int p=3e7,q=1e6;
		struct node
		{
			int l,r;
			int ls,rs;
			int sum;
		};
		node t[p+5];
		int cur,root[q+5];
		inline int mid(int l,int r)
		{
			return (l+r)/2;
		}
		inline void create(int id)
		{
			if(t[id].l!=t[id].r&&t[id].ls==0&&t[id].rs==0)
			{
				cur++;
				t[id].ls=cur;
				t[t[id].ls].l=t[id].l;
				t[t[id].ls].r=mid(t[id].l,t[id].r);
				cur++;
				t[id].rs=cur;
				t[t[id].rs].l=mid(t[id].l,t[id].r)+1;
				t[t[id].rs].r=t[id].r;
			}
		}
		void change_(int hid,int id,int x,int delta)
		{
			t[id].sum+=delta; 
			if(t[id].l==t[id].r&&t[id].l==x)
				return ;
			create(hid);
			if(x<=mid(t[id].l,t[id].r))
			{
				t[id].rs=t[hid].rs;
				cur++;
				t[id].ls=cur;
				t[cur].l=t[id].l;
				t[cur].r=mid(t[id].l,t[id].r);
				t[cur].sum=t[t[hid].ls].sum;
				change_(t[hid].ls,t[id].ls,x,delta);
			}
			else
			{
				t[id].ls=t[hid].ls;
				cur++;
				t[id].rs=cur;
				t[cur].l=mid(t[id].l,t[id].r)+1;
				t[cur].r=t[id].r;
				t[cur].sum=t[t[hid].rs].sum;
				change_(t[hid].rs,t[id].rs,x,delta);
			}
		}
		int request1(int lid,int rid,int x,int s)
		{
			if(t[lid].l==t[lid].r)
				return t[lid].l;
			create(lid);
			create(rid);
			if(s-t[t[rid].ls].sum+t[t[lid].ls].sum>=x)
				return request1(t[lid].rs,t[rid].rs,x,s-t[t[rid].ls].sum+t[t[lid].ls].sum);
			return request1(t[lid].ls,t[rid].ls,x,s);
		}
		int request2(int lid,int rid,int x,int s)
		{
			if(t[lid].l==t[lid].r)
				return t[lid].l;
			create(lid);
			create(rid);
			if(s-t[t[rid].rs].sum+t[t[lid].rs].sum>=x)
				return request2(t[lid].ls,t[rid].ls,x,s-t[t[rid].rs].sum+t[t[lid].rs].sum);
			return request2(t[lid].rs,t[rid].rs,x,s);
		}
		int request_(int id,int l,int r)
		{
			if(t[id].l==l&&t[id].r==r)
				return t[id].sum;
			create(id);
			int mid_=mid(t[id].l,t[id].r);
			bool f1=l<=mid_,f2=mid_+1<=r;
			if(f1&&!f2)
				return request_(t[id].ls,l,r);
			else if(!f1&&f2)
				return request_(t[id].rs,l,r);
			else if(f1&&f2)
				return request_(t[id].ls,l,mid_)+request_(t[id].rs,mid_+1,r);
		}
		inline void build(int minium,int maxium)
		{
			cur++;
			root[0]=cur;
			t[cur].l=minium;
			t[cur].r=maxium;
		}
		inline void change(int hid,int id,int x,int delta)
		{
			cur++;
			t[cur].l=t[root[0]].l;
			t[cur].r=t[root[0]].r;
			t[cur].sum=t[root[hid]].sum;
			root[id]=cur;
			change_(root[hid],root[id],x,delta);
		}
		inline int request1(int lid,int rid,int x)
		{
			return request1(root[lid],root[rid],x,t[root[rid]].sum-t[root[lid]].sum);
		}
		inline int request2(int lid,int rid,int x)
		{
			return request2(root[lid],root[rid],x,t[root[rid]].sum-t[root[lid]].sum);
		}
		inline int request(int id,int l,int r)
		{
			return request_(root[id],l,r);
		}
int n,m;
int a[500005];
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	build(1,n);
	for(int i=1;i<=n;i++)
		change(i-1,i,a[i],1);
	for(int i=1;i<=m;i++)
	{
		int l,r;
		cin>>l>>r;
		int a=request1(l-1,r,(r-l+2)/2);
		int b=request2(l-1,r,(r-l+2)/2);
		if(a==b&&request(r,a,a)-request(l-1,a,a)>=(r-l+3)/2)
			cout<<a<<"\n";
		else
			cout<<0<<"\n";
	}
	return 0;
}

评测记录

2024/1/13 14:35
加载中...