在 SP3261 RACETIME - Race Against Time 的基础上改的
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define sort stable_sort
#define endl '\n'
ll a[200010],b[200010],L[200010],R[200010],pos[200010],sum[200010],klen,ksum;
void init(ll n)
{
klen=sqrt(n);
ksum=n/klen;
for(ll i=1;i<=ksum;i++)
{
L[i]=R[i-1]+1;
R[i]=R[i-1]+klen;
}
if(R[ksum]<n)
{
ksum++;
L[ksum]=R[ksum-1]+1;
R[ksum]=n;
}
for(ll i=1;i<=ksum;i++)
{
for(ll j=L[i];j<=R[i];j++)
{
pos[j]=i;
}
sort(b+L[i],b+R[i]+1);
sum[L[i]]=b[L[i]];
for(ll j=L[i]+1;j<=R[i];j++)
{
sum[j]=sum[j-1]+b[j];
}
}
}
ll query(ll l,ll r,ll val)
{
ll ans=0;
if(pos[l]==pos[r])
{
for(ll i=l;i<=r;i++)
{
ans+=(a[i]<=val)*a[i];
}
}
else
{
for(ll i=l;i<=R[pos[l]];i++)
{
ans+=(a[i]<=val)*a[i];
}
for(ll i=pos[l]+1;i<=pos[r]-1;i++)
{
ans+=sum[upper_bound(b+L[i],b+R[i]+1,val)-b-1];
}
for(ll i=L[pos[r]];i<=r;i++)
{
ans+=(a[i]<=val)*a[i];
}
}
return ans;
}
int main()
{
ll n,q,l,r,val,ans=0,i;
scanf("%lld",&n);
for(i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
b[i]=a[i];
}
init(n);
scanf("%lld",&q);
for(i=1;i<=q;i++)
{
scanf("%lld%lld%lld",&l,&r,&val);
l^=ans;
r^=ans;
val^=ans;
ans=query(l,r,val);
printf("%lld\n",ans);
}
return 0;
}