POJ 2761 主席树

链接:

http://poj.org/problem?id=2761

代码:

31 struct Node { int l, r, sum; }T[MAXN * 40];
32 int a[MAXN], root[MAXN], cnt;
33 VI v;
34 
35 void update(int l, int r, int &x, int y, int pos) {
36     T[++cnt] = T[y], T[cnt].sum++, x = cnt;
37     if (l == r) return;
38     int m = (l + r) >> 1;
39     if (m >= pos) update(l, m, T[x].l, T[y].l, pos);
40     else update(m + 1, r, T[x].r, T[y].r, pos);
41 }
42 
43 int query(int l, int r, int x, int y, int k) {
44     if (l == r) return l;
45     int m = (l + r) >> 1;
46     int sum = T[T[y].l].sum - T[T[x].l].sum;
47     if (sum >= k) return query(l, m, T[x].l, T[y].l, k);
48     else return query(m + 1, r, T[x].r, T[y].r, k - sum);
49 }
50 
51 int main() {
52     int n, m;
53     cin >> n >> m;
54     rep(i, 1, n + 1) scanf("%d", a + i), v.pb(a[i]);
55     sort(all(v));
56     v.erase(unique(all(v)), v.end());
57     rep(i, 1, n + 1) a[i] = upper_bound(all(v), a[i]) - v.begin();
58     rep(i, 1, n + 1) update(1, n, root[i], root[i - 1], a[i]);
59     while (m--) {
60         int i, j, k;
61         scanf("%d%d%d", &i, &j, &k);
62         printf("%d\n", v[query(1, n, root[i - 1], root[j], k) - 1]);
63     }
64     return 0;
65 }

 

posted @ 2017-04-29 21:51  Flowersea  阅读(179)  评论(0编辑  收藏  举报