主席树模板 poj2104

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 const int maxn = 100010;
 5 struct Node {
 6     int L, R, sum;
 7 }T[maxn * 20];
 8 int cnt;
 9 void insert(int& num, int& val, int L, int R) {
10     T[cnt++] = T[val]; val = cnt - 1;
11     ++T[val].sum;
12     if (L == R) return;
13     int mid = (L + R) >> 1;
14     if (num <= mid) insert(num, T[val].L, L, mid);
15     else insert(num, T[val].R, mid + 1, R);
16 }
17 int query(int i, int j, int k, int L, int R) {
18     if (L == R) return L;
19     int t = T[T[j].L].sum - T[T[i].L].sum;
20     int mid = (R + L) >> 1;
21     if (k <= t) return query(T[i].L, T[j].L, k, L, mid);
22     else return query(T[i].R, T[j].R, k - t, mid + 1, R);
23 }
24 struct node {
25     int val, idx;
26     bool operator < (const node& rhs) const {
27         return val < rhs.val;
28     }
29 }a[maxn];
30 int rk[maxn], root[maxn];
31 int n, m;
32 int main() {
33     T[0].L = T[0].R = T[0].sum = 0;
34     root[0] = 0;
35     while (scanf("%d%d", &n, &m) != EOF) {
36         for (int i = 1; i <= n; ++i) {
37             scanf("%d", &a[i].val);
38             a[i].idx = i;
39         }
40         sort(a + 1, a + n + 1);
41         for (int i = 1; i <= n; ++i) rk[a[i].idx] = i;
42         cnt = 1;
43         for (int i = 1; i <= n; ++i) {
44             root[i] = root[i - 1];
45             insert(rk[i], root[i], 1, n);
46         }
47         while (m--) {
48             int i, j, k;
49             scanf("%d%d%d", &i, &j, &k);
50             printf("%d\n", a[query(root[i - 1], root[j], k, 1, n)].val);
51         }
52     }
53 }

 

posted @ 2020-03-17 22:41  programmer_w  阅读(1)  评论(0)    收藏  举报