48pts FHQ-Treap 求调
查看原帖
48pts FHQ-Treap 求调
727173
May_Cry_楼主2023/9/21 19:44
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 1e6 + 7;
int n ,m ,root ,tot ,last ,ans;
mt19937 rd(20100222);
struct node {
	int l ,r;
	int size ,val ,key;
}T[N];
int add(int v){
	T[++ tot].val = v;
	T[tot].key = rd();
	T[tot].size = 1;
	return tot; 
}
void pushup(int i){
	T[i].size = T[T[i].l].size + T[T[i].r].size + 1;
}
int merge(int x ,int y){
	if (!x || !y) return x | y;
	if (T[x].key <= T[y].key){
		T[x].r = merge(T[x].r ,y);
		pushup(x);
		return x;
	}
	else{
		T[y].l = merge(x ,T[y].l);
		pushup(y);
		return y;
	}
}
void split (int p ,int val ,int &x ,int &y){
	if (!p) x = y = 0;
	else{
		if (T[p].val <= val){
			x = p ,split(T[x].r ,val ,T[x].r ,y);
		}
		else {
			y = p ,split(T[y].l ,val ,x ,T[y].l);
		}
		pushup(p);
	}
}
int query(int p ,int k){
	if (T[T[p].l].size + 1 == k) return T[p].val;
	if (k <= T[T[p].l].size) return query (T[p].l ,k);
	else return query (T[p].r ,k - T[T[p].l].size - 1);
}
int read();
int main(){
	n = read() ,m = read();
	for (int i = 1;i <= n;i ++) {
		int x = read();int l ,r;
		split(root ,x ,l ,r);
		root = merge(merge(l ,add(x)) ,r);
	}
	while (m --){
		int op = read() ,x = read();
		x = x ^ last;
		if(op == 1) {
			int l ,r;
			split(root ,x ,l ,r);
			root = merge(merge(l ,add(x)) ,r);
		}
		if(op == 2){
			int g ,l ,r;
			split(root ,x ,l ,r);
		    split(root ,x - 1 ,l ,g);
		    g = merge(T[g].l ,T[g].r);
		    root = merge(merge(l ,g) ,r);
		}
		if(op == 3){
			int l ,r;
			split(root ,x - 1 ,l ,r);
			last = T[l].size + 1;
			ans ^= last;
//			cout << last << endl;
			root = merge(l ,r);
		}
		if(op == 4){
			last = query(root ,x);
//			cout << last << endl;
			ans ^= last;
		}
		if(op == 5){
			int l ,r;
			split(root ,x - 1 , l, r);
		    last = query(l ,T[l].size);
//		    cout << last << endl;
		    ans ^= last;
		    root = merge(l ,r);
		}
		if(op == 6){
			int l ,r;
			split(root ,x ,l ,r);
			last = query(r ,1);
			ans ^= last;
//			cout << last << endl;
			root = merge(l ,r);
		}
	}
	cout << ans;
	return 0;
}
int read(){
	int x = 0 ,f = 1;char ch = getchar();
	while(ch < '0' || ch > '9'){if(ch == '-')f = -1;ch = getchar();}
	while(ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + (ch ^ 48);ch = getchar();}
	return x * f;
}
2023/9/21 19:44
加载中...