求调:0pts,只过了subtask1
查看原帖
求调:0pts,只过了subtask1
1591487
Eason_hao楼主2025/7/2 10:51
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m, op, _, a[10005], l[10005], r[10005], s[10005], cnt[10005];
int qrank(int x, int k)
{
	if (!x) return 0;
	if (a[x] == k) return s[l[x]];
	if (a[x] > k) return qrank(l[x], k);
	return qrank(r[x], k) + cnt[x] + s[l[x]];
}
int qval(int x, int k)
{
	if (!x) return 0; 
	if (k <= s[l[x]]) return qval(l[x], k);
	if (k > cnt[x] + s[l[x]]) return qval(r[x], k - cnt[x] - s[l[x]]);
	return a[x];
}
int pre(int x, int k)
{
	if (!x) return -2147483647;
	if (a[x] < k)
	{
		if (!r[x]) return a[x];
		if (cnt[x]) return max(a[x], pre(r[x], k));
		return pre(r[x], k);
	}
	if (l[x]) return pre(l[x], k);
	return -2147483647;
}
int nxt(int x, int k)
{
	if (!x) return 2147483647;
	if (a[x] > k)
	{
		if (!l[x]) return a[x];
		if (cnt[x]) return min(a[x], nxt(l[x], k));
		return nxt(l[x], k);
	}
	if (r[x]) return nxt(r[x], k);
	return 2147483647;
}
void add(int x, int k)
{
	if (!x)
	{
		a[++n] = k, cnt[n] = s[n] = 1;
		return;
	}
	s[x]++;
	if (a[x] == k)
	{
		cnt[x]++;
		return;
	}
	if (a[x] < k) add(r[x], k);
	else add(l[x], k);
}
signed main()
{
	cin >> m;
	while (m--)
	{
		cin >> op >> _;
		if (op == 1) cout << qrank(1, _) + 1 << endl;
		if (op == 2) cout << qval(1, _) << endl;
		if (op == 3) cout << pre(1, _) << endl;
		if (op == 4) cout << nxt(1, _) << endl;
		if (op == 5) add(1, _);
	}
	return 0;
}
2025/7/2 10:51
加载中...