1 条题解

  • 0
    @ 2021-8-8 0:27:34

    C++ :

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    using namespace std;
    const int N=100010,M=10010;
    int n,m;
    int a[N],idx,root[N];
    vector<int> nums;
    struct Node{
     int l,r;
     int cnt;
    }tr[N*4+N*17];
    int find(int x){
     return lower_bound(nums.begin(),nums.end(),x)-nums.begin();
    }
    int build(int l,int r){
     int p=++idx;
     if(l==r)    return p;
     int mid=l+r>>1;
     tr[p].l=build(l,mid),tr[p].r=build(mid+1,r);
     return p;
    }
    int insert(int p,int l,int r,int x){
     int q=++idx;
     tr[q]=tr[p];
     if(l==r){
      tr[q].cnt++;
      return q;
     }
     int mid=l+r>>1;
     if(x<=mid)   tr[q].l=insert(tr[p].l,l,mid,x);
     else        tr[q].r=insert(tr[p].r,mid+1,r,x);
     tr[q].cnt=tr[tr[q].l].cnt+tr[tr[q].r].cnt;
     return q;
    }
    int query(int q,int p,int l,int r,int k){
     if(l==r)   return r;
     int cnt=tr[tr[q].l].cnt-tr[tr[p].l].cnt;
     int mid=l+r>>1;
     if(k<=cnt)    return query(tr[q].l,tr[p].l,l,mid,k);
     else          return query(tr[q].r,tr[p].r,mid+1,r,k-cnt);
    }
    int main(){
     scanf("%d%d",&n,&m);
     for(int i=1;i<=n;i++){
      scanf("%d",&a[i]);
      nums.push_back(a[i]);
     }
     sort(nums.begin(),nums.end());
     nums.erase(unique(nums.begin(),nums.end()),nums.end());
     root[0]=build(0,nums.size()-1);
     for(int i=1;i<=n;i++)
        root[i]=insert(root[i-1],0,nums.size()-1,find(a[i]));
        while(m--){
         int l,r,k;
         scanf("%d%d%d",&l,&r,&k);
         printf("%d\n",nums[query(root[r],root[l-1],0,nums.size()-1,k)]);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    166
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    4
    已通过
    4
    上传者