rt,写的 O(nnlogn) 的,常数也太难卡了,但是不想改回滚莫队,还有其他办法吗)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("no-stack-protector,unroll-loops,fast-math,inline")
#pragma GCC target("avx,avx2,abm,mmx,fma")
#pragma GCC target("sse,sse2,sse3,sse4,sse4.1,sse4.2,ssse3")
#include <algorithm>
#include <iostream>
using namespace std;
const int N = 2e5 + 5;
int n, m, k, mc[N], len, id[N];
char ans[N];
struct Q
{
int l, r, id;
} q[N];
struct
{
int tr[N * 2][2], cnt[N * 2], xval, idx = 1;
void insert(int x)
{
int p = 1;
for (int i = 0; i < 18; i++)
{
int b = x >> i & 1;
if (!tr[p][b])
tr[p][b] = ++idx;
p = tr[p][b], cnt[p]++;
}
xval ^= x;
}
void remove(int x)
{
int p = 1;
for (int i = 0; i < 18; i++)
{
int b = x >> i & 1;
p = tr[p][b], cnt[p]--;
}
xval ^= x;
}
void add()
{
int p = 1;
for (int i = 0; p; i++)
{
if ((cnt[tr[p][1]] ^ cnt[tr[p][0]]) & 1)
xval ^= 1 << i;
swap(tr[p][0], tr[p][1]), p = tr[p][0];
}
}
void del()
{
int p = 1;
for (int i = 0; p; i++)
{
if ((cnt[tr[p][1]] ^ cnt[tr[p][0]]) & 1)
xval ^= 1 << i;
swap(tr[p][0], tr[p][1]), p = tr[p][1];
}
}
} T;
void read(int &x)
{
static char ch = getchar();
x = 0;
while (!isdigit(ch))
ch = getchar();
while (isdigit(ch))
x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
}
int main()
{
read(n), read(m);
while (n--)
{
int x;
read(x), mc[x] ^= 1;
}
read(k);
for (int i = 1; i <= k; i++)
read(q[i].l), read(q[i].r), q[i].id = i;
len = __builtin_sqrt(m);
for (int i = 1; i <= m; i++)
id[i] = (i + len - 1) / len;
sort(q + 1, q + k + 1, [](Q a, Q b) {
if (id[a.l] ^ id[b.l])
return a.l < b.l;
return id[a.l] & 1 ? a.r < b.r : a.r > b.r;
});
for (int i = 1, l = 1, r = 0; i <= k; i++)
{
while (l > q[i].l)
{
T.add();
if (mc[--l])
T.insert(0);
}
while (r < q[i].r)
if (mc[++r])
T.insert(r - l);
while (l < q[i].l)
{
if (mc[l++])
T.remove(0);
T.del();
}
while (r > q[i].r)
if (mc[r--])
T.remove(r + 1 - l);
ans[q[i].id] = T.xval ? 'A' : 'B';
}
fwrite(ans + 1, 1, k, stdout);
return 0;
}