提交AC,本地‘停止工作’,求调
查看原帖
提交AC,本地‘停止工作’,求调
469375
Imtking楼主2022/7/11 18:16
#include <iostream>

using namespace std;

struct hjt_tree
{
	int l, r, s;
	char k;
} t[3000100];
int cnt, rt[100100];

inline int copy (int tp)
{
	t[++cnt] = t[tp];
	return cnt;
}

inline void update (int &tp, int l, int r, char k)
{
	tp = copy (tp);
	if (l == r) {t[tp].k = k, t[tp].s = 1; return ;}
	int mid = (l + r) >> 1;
	if (t[t[tp].l].s != mid - l + 1) update (t[tp].l, l, mid, k);
	else update (t[tp].r, mid + 1, r, k);
	t[tp].s = t[t[tp].l].s + t[t[tp].r].s;
}

inline char query (int tp, int l, int r, int k)
{
	if (l == r) return t[tp].k;
	int mid = (l + r) >> 1;
	if (k <= t[t[tp].l].s) return query (t[tp].l, l, mid, k);
	else return query (t[tp].r, mid + 1, r, k - t[t[tp].l].s);
}

int main ()
{
	int n, v;
	cin >> n;
	for (int i = 1; i <= n; ++i)
	{
		char op;
		cin >> op;
		if (op == 'T')
		{
			char x;
			cin >> x;
			++v, rt[v] = rt[v - 1];
			update (rt[v], 1, n, x);
		}
		else if (op == 'U')
		{
			int x;
			cin >> x;
			++v, rt[v] = rt[v - x - 1];
		}
		else
		{
			int x;
			cin >> x;
			cout << query (rt[v], 1, n, x) << "\n";
		}
	}
	return 0;
}
2022/7/11 18:16
加载中...