1 条题解
-
0赵青海 (huhe) LV 7 SU @ 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
- 上传者