Treap +莫队全部RE求调
查看原帖
Treap +莫队全部RE求调
470590
LikAzusa_楼主2024/10/21 19:34

rt

#include <bits/stdc++.h>
using namespace std;

inline int read()
{
	int x = 0, f = 1; char c = getchar();
	while(c > '9' || c < '0') {if(c == '-') f = -1; c = getchar();}
	while(c <= '9' && c >= '0') {x = x * 10 + c - '0'; c = getchar();}
	return x * f;
}
	
const int maxn = 3e5 + 10;
int len;
struct Node
{
	int size, rnd, val;
	int ch[2];
}t[maxn<<4];
struct node
{
	int l, r, k;
	int id;
}q[50010];

bool cmp(node a, node b)
{
	if((a.l / len) == (b.l / len)) return a.r < b.r;
	return a.l < b.l;
}

void update(int id)
{
	t[id].size = t[t[id].ch[0]].size + t[t[id].ch[1]].size + 1;
}

int tot, rt;

int newNode(int val)
{
	t[++tot].size = 1;
	t[tot].rnd = rand();
	t[tot].val = val;
	return tot;
}

void split(int id, int val, int &x, int &y)
{
	if(!id) {x = y = 0; return;}
	if(t[id].val < val)
	{
		x = id;
		split(t[id].ch[1], val, t[id].ch[1], y); 
	}
	else
	{
		y = id;
		split(t[id].ch[0], val, x, t[id].ch[0]);
	}
	update(id);
}

int merge(int x, int y)
{
	if(!x || !y) return x + y;
	if(t[x].rnd < t[y].rnd)
	{
		t[x].ch[1] = merge(t[x].ch[1], y);
		update(x); return x;
	}
	else
	{
		t[y].ch[0] = merge(x, t[y].ch[0]);
		update(y); return y;
	}
}

void ins(int val)
{
//	printf("In insert\n");
	int id = newNode(val);
	int x, y;
	split(rt, val, x, y);
	rt = merge(merge(x, id), y);
}

int kth(int id, int k)
{
	while(1)
	{
		int lsize = t[t[id].ch[0]].size;
		if(k == lsize + 1) return t[id].val;
		else if(k <= lsize) id = t[id].ch[0];
		else k -= lsize+1, id = t[id].ch[1];
	}
}

void del(int val)
{
	int x, y, z;
//	printf("In del\n");
	split(rt, val, x, y);
	split(y, val+1, y, z);
	y = merge(t[y].ch[0], t[y].ch[1]);
	rt = merge(merge(x, y), z); 
}

//void inorder(int id)
//{
//	if(!id) return;
//	inorder(t[id].ch[0]);
//	printf("%d ", t[id].val);
//	inorder(t[id].ch[1]);
//}

int n, m;
int a[maxn], ans[maxn];

int main()
{
	n = read(); m = read();
	len = sqrt(n);
	for(int i = 1; i <= n; i++) a[i] = read();
	for(int i = 1; i <= m; i++) q[i].l = read(), q[i].r = read(), q[i].k = read(), q[i].id = i;
	sort(q + 1, q + m + 1, cmp);
	int l = 1, r = 0;
//	inorder(rt);
//	cout << endl;
	for(int i = 1; i <= m; i++)
	{
		while(l > q[i].l) ins(a[--l]);
		while(r < q[i].r) ins(a[++r]);
		while(l < q[i].l) del(a[l++]);
		while(r > q[i].r) del(a[r--]);
		ans[q[i].id] = kth(rt, q[i].k);
	}
	for(int i = 1; i <= m; i++) cout << ans[i] << endl;
	return 0;
}
2024/10/21 19:34
加载中...