Kth number 【HDU - 2665】【主席树】

题目链接

不理解主席树的可以看这篇文章,关于主席树的深度理解。

这是道静态主席树的模板题,但是题目的作者却写错了题目,它让我们求第K小的,而不是第K大的。好坑!!

 

完整代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
using namespace std;
typedef long long ll;
const int maxN=100005;
int N, M, cnt, root[maxN], lsan[maxN];
struct node
{
    int l, r, sum;
    node(int a=0, int b=0, int c=0):l(a), r(b), sum(c) {}
}tree[maxN*20];
struct Value
{
    int x, id;
    Value(int a=0, int b=0):x(a), id(b) {}
}val[maxN];
bool cmp(Value e1, Value e2) { return e1.x>1;
    if(num<=mid) update(tree[rt].l, l, mid, num);
    else update(tree[rt].r, mid+1, r, num);
}
int Query(int i, int j, int k, int l, int r)
{
    int d=tree[tree[j].l].sum-tree[tree[i].l].sum;
    if(l==r) return l;
    int mid=(l+r)>>1;
    if(k<=d) return Query(tree[i].l, tree[j].l, k, l, mid);
    else return Query(tree[i].r, tree[j].r, k-d, mid+1, r);
}
int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d%d", &N, &M);
        init();
        for(int i=1; i<=N; i++)
        {
            scanf("%d", &val[i].x);
            val[i].id=i;
        }
        sort(val+1, val+1+N, cmp);
        for(int i=1; i<=N; i++) lsan[val[i].id]=i;
        for(int i=1; i<=N; i++)
        {
            root[i]=root[i-1];
            update(root[i], 1, N, lsan[i]);
        }
        while(M--)
        {
            int e1, e2, e3;
            scanf("%d%d%d", &e1, &e2, &e3);
            printf("%d\n", val[Query(root[e1-1], root[e2], e3, 1, N)].x);
        }
    }
    return 0;
}

 

你可能感兴趣的:(数据结构)