zoukankan      html  css  js  c++  java
  • 模板—主席树(不修改)

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    struct node
    {
        int l,r,sum;
        #define l(x) tr[x].l
        #define r(x) tr[x].r
        #define sum(x) tr[x].sum
    }tr[100000000];
    
    int cnt,T[100010];
    int n,Q,m,a[100010],b[100010];
    
    int build(int l,int r)
    {
        int now=++cnt;
        if(l<r)
        {
            int mid=(l+r)>>1;
            l(now)=build(l,mid);
            r(now)=build(mid+1,r);
        }
        return now;
    }
    void build_new(int mark,int loc)
    {
        T[mark]=++cnt;
        sum(cnt)=sum(T[mark-1])+1;
        int l=1,r=m,mid,now=cnt,still=T[mark-1];
        for(;l(still)||r(still);)
        {
            mid=(l+r)>>1;
            if(loc>mid)
            {
                l(now)=l(still),r(now)=++cnt;
                sum(cnt)=sum(r(still))+1;
                now=cnt;still=r(still);
                l=mid+1;
            }
            else
            {
                r(now)=r(still),l(now)=++cnt;
                sum(cnt)=sum(l(still))+1;
                now=cnt;still=l(still);
                r=mid;
            }
        }
    }
    int ask(int a,int b,int l,int r,int k)
    {
        if(l==r)    return l;
        int lm=sum(l(b))-sum(l(a)),
            mid=(l+r)>>1;
        if(k<=lm)return ask(l(a),l(b),l,mid,k);
        return ask(r(a),r(b),mid+1,r,k-lm);
    }
    signed main()
    {
        cin>>n>>Q;
        for(int i=1;i<=n;i++)cin>>a[i],b[i]=a[i];
        sort(b+1,b+n+1);
        m=unique(b+1,b+n+1)-b-1;
        T[0]=build(1,m);
        for(int i=1;i<=n;i++)
        {
            int loc=lower_bound(b+1,b+n+1,a[i])-b;
            build_new(i,loc);
        }
        int i,j,k;
        for(int num=1;num<=Q;num++)
        {
            cin>>i>>j>>k;
            cout<<b[ask(T[i-1],T[j],1,m,k)]<<endl;
        }
    }
    View Code
    波澜前,面不惊。
  • 相关阅读:
    网站建设怎样添加设为首页和加入收藏代码
    在WEB项目中调用QQ通讯组件打开QQ聊天界面
    网页引用Font Awesome图标
    jQuery鼠标划入划出
    django框架
    python连接数据库:
    数据库:
    TCP:
    数据库:
    Excel在任务栏中只显示一个窗口的解决办法
  • 原文地址:https://www.cnblogs.com/Al-Ca/p/11022653.html
Copyright © 2011-2022 走看看