主席树0pts求调
查看原帖
主席树0pts求调
541499
StarRoam楼主2024/3/12 19:35
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,m,tal,cnt,kind[N],rt[N];
struct Tree{int rs,ls,val;}t[N*50];
struct Segment_Tree{
	void build(int &pos,int l,int r)
	{
		pos=++cnt;
		if(l==r) return ;
		int mid=(l+r)>>1;
		build(t[pos].ls,l,mid);
		build(t[pos].rs,mid+1,r);
	}
	void update(int &pos,int prev,int l,int r,int x)
	{
		pos=++cnt;
		t[pos].val=t[prev].val,t[pos].ls=t[prev].ls,t[pos].rs=t[prev].rs;
		if(l==r)
		{
			t[pos].val=1;
			return ;
		}
		int mid=(l+r)>>1;
		if(x<=mid) update(t[pos].ls,t[prev].ls,l,mid,x);
		else update(t[pos].rs,t[prev].rs,mid+1,r,x);
		t[pos].val=t[t[pos].ls].val+t[t[pos].rs].val;
	}
}T;
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>kind[i];
		tal=max(tal,kind[i]);
	}
	T.build(rt[0],1,n);
	for(int i=1;i<=n;i++)
		T.update(rt[i],rt[i-1],1,n,kind[i]);
	cin>>m;
	while(m--)
	{
		int px,py;
		cin>>px>>py;
		cout<<t[rt[py]].val-t[rt[px-1]].val<<"\n";
	}
	return 0;
} 
2024/3/12 19:35
加载中...