主席树模板 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 }