主席树求调
查看原帖
主席树求调
748239
OIbishop楼主2023/3/20 13:49
#include <bits/stdc++.h>
using namespace std;
const int N = (1e5 + 5) * 25;
int val[N] , ls[N] , rs[N] , root[N] , n;
int cnt , len[N] , top = 0;

inline void push_up (int o)
{
	val[o] = val[ls[o]] + val[rs[o]];
}

inline int build_tree (int l , int r)
{
	int o = cnt++;
	if (l == r) return len[o] = 1 , o;
	int mid = l + r >> 1;
	ls[o] = build_tree (l , mid);
	rs[o] = build_tree (mid + 1 , r);
	push_up (o);
	return o;
}

inline int Copy (int pre)
{
	int o = cnt++;
	val[o] = val[pre];
	ls[o] = ls[pre];
	rs[o] = rs[pre];
	len[o] = len[pre];
	return o;
}

inline void insert (int &pos , int o , int l , int r , int now , int v)
{
	pos = Copy (o);
	if (l == r) val[pos] = v , len[pos]++;
	int mid = l + r >> 1;
	if (now <= mid)
		insert (ls[pos] , ls[o] , l , mid , now , v);
	else 
		insert (rs[pos] , rs[o] , mid + 1 , r , now , v);
}

inline int query (int o , int l , int r , int now)
{
	if (l == r) return val[o];
	int mid = l + r >> 1;
	if (now <= mid)
		return query (ls[o] , l , mid , now);
	else 
		return query (rs[o] , mid + 1 , r , now);
} 

signed main ()
{
	std :: cin >> n;
	fflush (stdin);
	root[0] = build_tree (1 , 100000);
	for (int i = 1; i <= n; i++)
	{
		char opt;
		cin >> opt;
		if (opt == 'T')
		{
			char c;
			cin >> c;
			insert (root[++top] , root[top - 1] , 1 , 100000 , len[top] + 1 , (int) (c));
		}
		else if (opt == 'U') 
		{
			int x;
			cin >> x;
			root[top] = root[top - x];
		}
		else 
		{
			int x;
			cin >> x;
			cout << (char) (query (root[top] , 1 , 100000 , x)) << endl;
		}
	}
	return 0;
} 

RT

2023/3/20 13:49
加载中...