主席树 RE#6
查看原帖
主席树 RE#6
926886
kind_Ygg楼主2024/10/8 19:19
#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=2e5+6;
int n,q;
int a[N],b[N],f[N];
int tree[N<<5],ls[N<<5],rs[N<<5];
int root[N];
int last_ans;
int x,y,k;
int toooooooooooooooooot;
bool cmp(int a,int b){return a<b;}
int build(int l,int r)
{
	int rt=++toooooooooooooooooot;
	if(l==r) return rt;
	int mid=l+((r-l)>>1);
	ls[rt]=build(l,mid);
	rs[rt]=build(mid+1,r);
	return rt;
}
int update(int gen,int l,int r,int x,int y)
{
	int rt=++toooooooooooooooooot;
	tree[rt]=tree[gen]+y;
	ls[rt]=ls[gen];
	rs[rt]=rs[gen];
	if(l==r) return rt;
	int mid=l+((r-l)>>1);
	if(x<=mid) ls[rt]=update(ls[gen],l,mid,x,y);
	else rs[rt]=update(rs[gen],mid+1,r,x,y);
	return rt;
}
int query(int rt,int l,int r,int s,int t)//目前的根 区间左 区间右 <=x
{
	if(s<=l and r<=t) return tree[rt];
	int mid=l+((r-l)>>1);
	int ans=0;
	if(s<=mid) ans+=query(ls[rt],l,mid,s,t);
	if(mid+1<=t) ans+=query(rs[rt],mid+1,r,s,t);
	return ans;
}
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i],b[i]=a[i];
	sort(b+1,b+n+1,cmp);
	int len=unique(b+1,b+n+1)-b-1;
	root[0]=build(1,len);
	for(int i=1;i<=n;i++)
	{
		f[i]=lower_bound(b+1,b+len+1,a[i])-b;
		root[i]=update(root[i-1],1,len,f[i],a[i]);
	}
	cin>>q;
	while(q--)
	{
		cin>>x>>y>>k;
		x^=last_ans,y^=last_ans,k^=last_ans;
		if(x>y) swap(x,y);
		if(k<b[1]){cout<<0<<'\n';last_ans=0;continue;}
		last_ans=query(root[y],1,len,1,lower_bound(b+1,b+len+1,k)-b)-query(root[x-1],1,len,1,lower_bound(b+1,b+len+1,k)-b);
		cout<<last_ans<<'\n';
	}
	return 0;
}
2024/10/8 19:19
加载中...