主席树模版

来源:互联网 发布:淘宝店铺首页海报代码 编辑:程序博客网 时间:2024/06/08 11:44
主席树模版
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 100010;int ls[maxn*20], rs[maxn*20], sum[maxn*20];int T[maxn], tot;void build(int l, int r, int& rt){rt = ++tot;sum[rt] = 0;if(l == r)return;int m = l+r>>1;build(l, m, ls[rt]);build(m+1, r, rs[rt]);}void update(int last, int p, int l, int r, int& rt){rt = ++tot;ls[rt] = ls[last];rs[rt] = rs[last];sum[rt] = sum[last]+1;if(l == r)return;int m = l+r>>1;if(p <= m)update(ls[last], p, l, m, ls[rt]);elseupdate(rs[last], p, m+1, r, rs[rt]);}int query(int x, int y, int l, int r, int k){if(l == r)return l;int m = l+r>>1;int cnt = sum[ls[y]]-sum[ls[x]];if(k <= cnt)return query(ls[x], ls[y], l, m, k);elsereturn query(rs[x], rs[y], m+1, r, k-cnt);}int num[maxn], a[maxn], n, q;void cal(){for(int i = 1; i <= n; i++){scanf("%d", &a[i]);num[i] = a[i];}tot = 0;sort(num+1, num+n+1);int cnt = unique(num+1, num+n+1)-(num+1);build(1, cnt, T[0]);for(int i = 1; i <= n; i++){a[i] = lower_bound(num+1, num+cnt+1, a[i])-num;}for(int i = 1; i <= n; i++)update(T[i-1], a[i], 1, cnt, T[i]);while(q--){int x, y, k;scanf("%d %d %d", &x, &y, &k);printf("%d\n", num[query(T[x-1], T[y], 1, cnt, k)]);}}int main(){int T;scanf("%d", &T);while(T--){scanf("%d %d", &n, &q);cal();}return 0;}
0 0
原创粉丝点击