莫名的T了,还没我用分块效率高。。。
# include <bits/stdc++.h>
# define int long long
#define stdi stdin
#define stdo stdout
using namespace std;
inline int read()
{
char in = getchar(),f = 0; int t = 0;
for(; !isdigit(in);in = getchar())if(!(in ^ 45)) f = 1;
for(; in >= '0' && in <= '9';in = getchar())
t = (t << 1) + (t << 3) + (in ^ 48);
return f ? -t : t;
}
inline void write(long long x)
{
static int t[25]; int tp = 0;
if(x == 0)return(void)(putchar('0'));
else if(x < 0) putchar('-'),x = -x;
while(x) t[tp++] = x % 10,x /= 10;
while(tp--) putchar(t[tp] + '0');
}
const int N = 20000005;
int n = read (), m;
int a[N], last;
struct Node
{
int l; int r;
int ll; int rr;
long long num;
long long add;
}tree[N];
# define size chtholly
int size;
inline int add (int ind)
{
tree[++ size] = tree[ind];
return size;
}
inline void push (int ind)
{
long long p1 = tree[tree[ind].ll].num;
long long p2 = tree[tree[ind].rr].num;
tree[ind].num = p1 + p2;
}
inline int build (int l, int r, int ind)
{
ind = add (ind);
tree[ind].l = l;
tree[ind].r = r;
if(l == r)
{
tree[ind].num = 0;
return ind;
}
int m1 = l + r >> 1; tree[ind].ll = build(l, m1, tree[ind].ll);
int m2 = m1 * 1 + 1; tree[ind].rr = build(m2, r, tree[ind].rr);
return ind;
}
inline int amend (int ind, int pos, int k)
{
ind = add (ind);
if (tree[ind].l == tree[ind].r)
{
tree[ind].num += k;
return ind;
}
if (tree[tree[ind].ll].r >= pos) tree[ind].ll = amend (tree[ind].ll, pos, k);
if (tree[tree[ind].rr].l <= pos) tree[ind].rr = amend (tree[ind].rr, pos, k);
push (ind);
return ind;
}
# define L tree[ind].l
# define R tree[ind].r
inline int find (int ind, int l, int r)
{
if (tree[ind].l >= l and tree[ind].r <= r)
{
return tree[ind].num;
}
int ret = 0;
if (tree[tree[ind].ll].r >= l) ret += find (tree[ind].ll, l, r);
if (tree[tree[ind].rr].l <= r) ret += find (tree[ind].rr, l, r);
return ret;
}
int node[N], now;
int s[N], cnt;
int c[N];
signed main()
{
setvbuf (stdi, (char*) calloc (1 << 20, sizeof (char)), _IOFBF, 1 << 20);
setvbuf (stdo, (char*) calloc (1 << 20, sizeof (char)), _IOFBF, 1 << 20);
for (int i = 1; i <= n; i ++) a[i] = read (), s[++ cnt] = a[i];
sort (1 + s, 1 + s + cnt);
cnt = unique (s + 1, s + 1 + cnt) - s - 1;
node[0] = build (1, n, 1);
for (int i = 1; i <= n; i ++)
{
c[i] = lower_bound (s + 1, s + 1 + cnt, a[i]) - s;
node[i] = amend (node[i - 1], c[i], a[i]);
}
last = 0;
m = read ();
while (m --)
{
int l = read (), r = read (), k = read ();
l ^= last, r ^= last, k ^= last;
int back = upper_bound (s + 1, s + 1 + cnt, k) - s - 1;
if (l > r) swap (l, r);
if (!k)
{
last = 0;
}
else
{
last = find (node[r], 1, back) - find (node[l - 1], 1, back);
}
write (last);
puts("");
}
}