我是莱德同学,我需要莱德!
#include<bits/stdc++.h>
using namespace std;
int n,q,a[1000005];
int bk[1000005],S;
int l[1005],r[1005];
long long sm[1000005];
int b[1000005];
long long x,y,z,ans;
int find(int x,int c){
int lx = l[x],rx = r[x];
while(lx<rx){
int mid = (lx+rx+1)/2;
if(b[mid]<=c)lx = mid;
else rx = mid-1;
}
return sm[rx];
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
S = 1200;
int last = 0;
for(int i = 1;i<=n;i++){
bk[i] = (i-1)/S+1;
if(bk[i]!=last){
last = bk[i];
l[bk[i]] = i;
r[bk[i]-1] = i-1;
}
}
r[bk[n]] = n;
for(int i = 1;i<=n;i++){
cin >> a[i];
b[i] = a[i];
}
for(int i = 1;i<=bk[n];i++){
sort(b+l[i],b+r[i]+1);
}
for(int i = 1;i<=n;i++){
sm[i] = sm[i-1]+b[i];
if(i==l[bk[i]])sm[i] = b[i];
}
cin >> q;
while(q--){
cin >> x >> y >> z;
x^=ans;
y^=ans;
z^=ans;
ans = 0;
if(bk[x]==bk[y]){
for(int i = x;i<=y;i++)if(a[i]<=z)ans+=a[i];
}
else{
for(int i = x;i<=r[bk[x]];i++)if(a[i]<=z)ans+=a[i];
for(int i = l[bk[y]];i<=y;i++)if(a[i]<=z)ans+=a[i];
for(int i = bk[x]+1;i<=bk[y]-1;i++)ans+=find(i,z);
}
cout << ans << "\n";
}
return 0;
}