[poj]-2104-K-th Number-可持久化线段树

来源:互联网 发布:及壮,知向廉洛之学 编辑:程序博客网 时间:2024/05/19 22:48

区间静态查找第K大值,无需修改,先离散化。马上省选了就没时间详细写了╮( ̄▽ ̄)╭

#include<iostream>#include<cstdio>#include<algorithm>#define maxn 100010using namespace std;struct node{int l, r, s;}t[maxn * 20];struct A{int n, i;}in[maxn];int n, m, cnt, root[maxn], rank[maxn];void insert(int &num, int &x, int l, int r){t[cnt] = t[x];x = cnt++;t[x].s++;if (l == r)return ;int mid = (l + r) >> 1;if (num <= mid)insert(num, t[x].l, l, mid);elseinsert(num, t[x].r, mid + 1, r);}int query(int i, int j, int k, int l, int r){if (l == r)return l;int tmp = t[t[j].l].s - t[t[i].l].s;int mid = (l + r) >> 1;if (k <= tmp)return query(t[i].l, t[j].l, k, l, mid);elsereturn query(t[i].r, t[j].r, k - tmp, mid + 1, r);}bool cmp(A a, A b){return a.n < b.n;}int main(){while (scanf("%d %d", &n, &m) != EOF){for (int i = 1; i <= n; i++){scanf("%d", &in[i].n);in[i].i = i;}sort(in + 1, in + n + 1, cmp);for (int i = 1; i <= n; i++)rank[in[i].i] = i;cnt = 1;for (int i = 1; i <= n; i++){root[i] = root[i - 1];insert(rank[i], root[i], 1, n);}while (m--){int i, j, k;scanf("%d %d %d", &i, &j, &k);printf("%d\n", in[query(root[i - 1], root[j], k, 1, n)].n);}}}



0 0