萌新刚学OI,求调主席树
查看原帖
萌新刚学OI,求调主席树
271096
Semorius楼主2021/8/7 16:20
#include <bits/stdc++.h>
using namespace std;
const int SIZE = 200005;
int n, m, tot, q;
int root[SIZE], a[SIZE], b[SIZE];
int vis[SIZE], H[SIZE];

inline int rd(){
	int f = 1, x = 0;
	char ch = getchar();
	while(!isdigit(ch)){
		if(ch == '-') f = -1;
		ch = getchar();
	}
	while(isdigit(ch)){
		x = x * 10 + (ch - '0');
		ch = getchar();
	}
	return f * x;
}

struct TREE{
	int l, r;
	int val;	
}t[SIZE*30];

int Build(int l, int r){
	int p = ++tot;
	if(l == r){
		t[p].val = a[l];
		return p;
	}
	int mid = (l + r) >> 1;
	t[p].l = Build(l, mid);
	t[p].r = Build(mid+1, r);
	t[p].val = t[t[p].l].val + t[t[p].r].val;
	return p;
}

int insert(int now, int l, int r, int x, int val){
	int p = ++tot;
	t[p] = t[now];
	if(l == r){
		t[p].val += val;
		return p;
	}
	int mid = (l + r) >> 1;
	if(x <= mid) t[p].l = insert(t[now].l, l, mid, x, val);
	else t[p].r = insert(t[now].r, mid+1, r, x, val);
	t[p].val = t[t[p].l].val + t[t[p].r].val;
	return p;
}

int ask(int p, int q, int l, int r, int k){
	if(l == r) return l;
	int mid = (l + r) >> 1;
	int cnt = t[t[p].l].val - t[t[q].l].val;
	if(k <= cnt) return ask(t[p].l, t[q].l, l, mid, k);
	else return ask(t[p].r, t[q].r, mid+1, r, k);
}

int main(){
	n = rd(), q = rd();
	for(int i = 1; i <= n; i++) 
		a[i] = rd(), b[i] = a[i];
	sort(b+1, b+1+n);
	m = unique(b+1, b+1+n) - b - 1;
	root[0] = Build(1, m);
	for(int i = 1; i <= n; i++){
		a[i] = lower_bound(b+1, b+1+m, a[i]) - b;
		root[i] = insert(root[i-1], 1, m, a[i], 1);	
	}
	while(q--){
		int l = rd(), r = rd(), k = rd();
		int ans = ask(root[r], root[l-1], 1, m, k);
		printf("%d\n", b[ans]);
	}
	return 0;
}
2021/8/7 16:20
加载中...