WA+RE求调
查看原帖
WA+RE求调
533742
Katyusha_01楼主2023/7/25 10:42
#include<bits/stdc++.h>
using namespace std;
typedef struct{
	int ls,rs,siz,val,key;
}Tree;
Tree New;
vector<Tree> t = {New};
int idx;
inline int Copy(int p)
{
	t.push_back(t[p]);
	return (++idx);
}
inline int Build(int val)
{
	t.push_back(New);
	idx++;
	t[idx].val = val;
	t[idx].key = rand();
	t[idx].siz = 1;
	return idx;
}
inline void push_up(int p)
{
	t[p].siz = t[t[p].ls].siz + t[t[p].rs].siz + 1;
}
int merge(int x,int y)
{
	if(!x || !y) return (x ^ y);
	if(t[x].key < t[y].key)
	{
		x = Copy(x);
		t[x].rs = merge(t[x].rs,y);
		push_up(x);
		return x;
	}
	y = Copy(y);
	t[y].ls = merge(x,t[y].ls);
	push_up(y);
	return y;
}
void splitval(int p,int k,int& l,int& r)
{
	if(!p)
	{
		l = r = 0;
		return;
	}
	p = Copy(p);
	if(t[p].val <= k)
	{
		l = p;
		splitval(t[p].rs,k,t[p].rs,r);
	}else{
		r = p;
		splitval(t[p].ls,k,l,t[p].ls);
	}
	push_up(p);
}
void splitsiz(int p,int k,int& l,int& r)
{
	if(!p)
	{
		l = r = 0;
		return;
	}
	p = Copy(p);
	if(t[t[p].ls].siz + 1 <= k)
	{
		l = p;
		splitsiz(t[p].rs,k - 1 - t[t[p].ls].siz,t[p].rs,r);
	}else{
		r = p;
		splitsiz(t[p].ls,k,l,t[p].ls);
	}
	push_up(p);
}
int root[500011];
int n;
int v,op,x;
signed main()
{
	srand(time(0));
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin >> n;
	for(int i = 1;i <= n;i++)
	{
		cin >> v >> op >> x;
		root[i] = root[v];
		int& rt = root[i];
		if(op == 1)
		{
			int l,r;
			splitval(rt,x,l,r);
			rt = merge(merge(l,Build(x)),r);
		}else if(op == 2)
		{
			int l,r;
			splitval(rt,x,l,r);
			if(l)
			{
				int ll,lr;
				splitsiz(l,t[l].siz - 1,ll,lr);
				if(t[lr].val == x)
				{
					rt = merge(ll,r);
				}else{
					rt = merge(l,r);
				}
			}
		}else if(op == 3)
		{
			int l,r;
			splitval(rt,x - 1,l,r);
			cout << t[l].siz + 1 << "\n";
		}else if(op == 4)
		{
			int l,r;
			splitsiz(rt,x,l,r);
			int ll,lr;
			splitsiz(l,x - 1,ll,lr);
			cout << t[lr].val << "\n";
		}else if(op == 5)
		{
			int l,r;
			splitval(rt,x - 1,l,r);
			if(l)
			{
				int ll,lr;
				splitsiz(l,t[l].siz - 1,ll,lr);
				cout << t[lr].val << "\n";
			}else{
				cout << INT_MIN << "\n";
			}
		}else{
			int l,r;
			splitval(rt,x,l,r);
			if(r)
			{
				int rl,rr;
				splitsiz(r,1,rl,rr);
				cout << t[rl].val << "\n";
			}else{
				cout << INT_MAX << "\n";
			}
		}
	}
	return 0;
}
2023/7/25 10:42
加载中...