求助主席树RE
查看原帖
求助主席树RE
936183
_zSqr_Mahiro_Oyama_楼主2024/10/8 10:46
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
struct Stree{
	int ls,rs;
	long long sum;
	#define ls(x) tree[x].ls
	#define rs(x) tree[x].rs
	#define sum(x) tree[x].sum
}tree[N<<5];
int cnt,root[N];
int n,q,a[N],A[N],len;
long long l,r,x;
long long ans;
int Q(int x){
	int t=lower_bound(A+1,A+1+len,x)-A;
	if(t>len||A[t]!=x)t--;
	return t;
}
int build(int l,int r){
	int x=++cnt;
	if(l==r)return x;
	int mid=l+r>>1;
	ls(x)=build(l,mid);
	rs(x)=build(mid+1,r);
}
int insert(int x,int l,int r,int i,int k){
	int y=++cnt;
	ls(y)=ls(x);
	rs(y)=rs(x);
	sum(y)=sum(x)+k;
	if(l==r)return y;
	int mid=l+r>>1;
	if(i<=mid)
		ls(y)=insert(ls(x),l,mid,i,k);
	else
		rs(y)=insert(rs(x),mid+1,r,i,k);
	return y;
}
long long query(int x,int l,int r,int s,int t){
	if(s<=l&&r<=t)return sum(x);
	long long res=0;
	int mid=l+r>>1;
	if(s<=mid)res+=query(ls(x),l,mid,s,t);
	if(t>mid)res+=query(rs(x),mid+1,r,s,t);
	return res;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i],A[i]=a[i];
	sort(A+1,A+1+n);
	len=unique(A+1,A+1+n)-A-1;
	root[0]=build(1,len);
	for(int i=1;i<=n;i++)
		root[i]=insert(root[i-1],1,len,Q(a[i]),a[i]);
	cin>>q;
	while(q--){
		cin>>l>>r>>x;
		l^=ans;r^=ans;x^=ans;
		int L=query(root[l-1],1,len,1,Q(x)),R=query(root[r],1,len,1,Q(x));
		cout<<(ans=(R-L))<<'\n';
	}
	return 0;
}
2024/10/8 10:46
加载中...