FHQ-Treap版,求Debug qwq,样例AC,提交全TLE+MLE。。
# include <bits/stdc++.h>
# define ffor(i,name) \
for (auto i = name.begin (); i != name.end (); ++ i)
# define iter vector <int> :: iterator
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
int n, m, op, x, lst, ans, l[1100005], r[1100005], a[1100005], w[1100005], sum[1100005], len, rt;
void pushup (int x) {
sum[x] = sum[l[x]] + sum[r[x]] + 1;
return ;
}
pii divide (int x, int k) {
if (! x)
return {0, 0};
if (a[x] < k) {
pii son = divide (r[x], k);
r[x] = son.first;
pushup (x);
return {x, son.second};
}
pii son = divide (l[x], k);
l[0] = son.second;
pushup (x);
return {son.first, x};
}
int merge (int x, int y) {
if (! x || ! y)
return x + y;
if (w[x] < w[y]) {
r[x] = merge (r[x], y);
pushup (x);
return x;
}
l[y] = merge (x, l[y]);
pushup (y);
return y;
}
void insert (int x, int i) {
a[++ len] = x;
w[len] = i;
sum[len] = 1;
pii t = divide (rt, x);
rt = merge (merge (t.first, len), t.second);
return ;
}
void del (int x) {
pii L = divide (rt, x), R = divide (L.second, x + 1);
R.first = merge (l[R.first], r[R.first]);
rt = merge (L.first, merge (R.first, R.second));
return ;
}
int find1 (int x) {
pii t = divide (rt, x);
int ans = sum[t.first] + 1;
rt = merge (t.first, t.second);
return ans;
}
int find2 (int x) {
int now = rt;
while (now)
if (sum[l[now]] + 1 == x)
return a[now];
else if (x <= sum[l[now]])
now = l[now];
else
x -= sum[l[now]] + 1, now = r[now];
return -1;
}
int last (int x) {
return find2 (find1 (x) - 1);
}
int next (int x) {
return find2 (find1 (x + 1));
}
int main () {
ios::sync_with_stdio (0);
cin.tie (0);
cout.tie (0);
cin >> n >> m;
for (int i = 1; i <= n; ++ i)
cin >> x, insert (x, i);
for (int i = 1; i <= m; ++ i) {
cin >> op >> x;
x ^= lst;
if (op < 2)
insert (x, i + n);
else if (op < 3)
del (x);
else if (op < 4)
lst = find1 (x), ans ^= lst;
else if (op < 5)
lst = find2 (x), ans ^= lst;
else if (op < 6)
lst = last (x), ans ^= lst;
else
lst = next (x), ans ^= lst;
}
cout << ans;
return 0;
}