MLE七个点
感觉不应该啊,求解答
#include<bits/stdc++.h>
using namespace std;
#define ls (t[cnt].l)
#define rs (t[cnt].r)
typedef long long ll;
const int N = 1100005;
int read()
{
int ans = 0;
char c = getchar(), last = ' ';
while(c < '0' || c > '9') last = c, c = getchar();
while(c >= '0' && c <= '9') ans = (ans << 1) + (ans << 3) + c - '0', c = getchar();
if(last == '-') ans = - ans;
return ans;
}
int cnt;
unsigned long long seed = 1;
int Rand()
{
seed *= 19260817;
return int(seed);
}
struct tree
{
int l, r, rad, siz;
int val;
}t[N];
void update(int cnt)
{
t[cnt].siz = t[ls].siz + t[rs].siz + 1;
}
int New(int x)
{
t[++cnt].val = x;
t[cnt].rad = Rand();
t[cnt].siz = 1;
return cnt;
}
void split(int cnt, int k, int &x, int &y)
{
if(!cnt)
{
x = y = 0;
return;
}
if(t[cnt].val <= k)
{
x = cnt;
split(rs, k, rs, y);
}
if(t[cnt].val > k)
{
y = cnt;
split(ls, k, x, ls);
}
update(cnt);
}
int merge(int x, int y)
{
if(x == 0) return y;
if(y == 0) return x;
if(t[x].rad <= t[y].rad)
{
t[x].r = merge(t[x].r, y);
update(x);
return x;
}
else
{
t[y].l = merge(x, t[y].l);
update(y);
return y;
}
}
int kth(int cnt, int k)
{
if(t[ls].siz + 1 == k) return t[cnt].val;
if(t[ls].siz >= k) return kth(ls, k);
else return kth(rs, k - t[ls].siz - 1);
}
int n, m, rt;
int last = 0, ans;
int main()
{
// freopen("1.in", "r", stdin);
// freopen("1.out", "w", stdout);
n = read(), m = read();
for(int i = 1; i <= n; i ++)
{
int k;
int x, y;
k = read();
split(rt, k, x, y);
rt = merge(merge(x, New(k)), y);
}
int k;
int opt, x, y, z;
for(int i = 1; i <= m; i ++)
{
opt = read(), k = read();
k ^= last;
if(opt == 1)
{
split(rt, k, x, y);
rt = merge(merge(x, New(k)), y);
}
if(opt == 2)
{
split(rt, k, x, y);
split(rt, k - 1, x, z);
z = merge(t[z].l, t[z].r);
rt = merge(merge(x, z), y);
}
if(opt == 3)
{
split(rt, k - 1, x, y);
last = t[x].siz + 1;
ans ^= last;
//printf("%lld\n", last);
rt = merge(x, y);
}
if(opt == 4)
{
last = kth(rt, k);
ans ^= last;
//printf("%lld\n", last);
}
if(opt == 5)
{
split(rt, k - 1, x, y);
last = kth(x, t[x].siz);
ans ^= last;
//printf("%lld\n", last);
rt = merge(x, y);
}
if(opt == 6)
{
split(rt, k, x, y);
last = kth(y, 1);
ans ^= last;
//printf("%lld\n", last);
rt = merge(x, y);
}
}
printf("%d", ans);
}