1. 程式人生 > >luogu P1533 可憐的狗狗

luogu P1533 可憐的狗狗

main oot return using str ++ ID \n ref

題目鏈接

luogu P1533 可憐的狗狗

題解

主席樹.

代碼

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 300001;
int ls[N*20],rs[N*20],sum[N*20];
int n,m,a[N],hash[N],cnt,root[N];
int x,y,k;
void lsh()
{
    sort(hash+1,hash+n+1);
    cnt=unique(hash+1,hash+n+1)-(hash+1
); for(int i=1;i<=n;i++)a[i]=lower_bound(hash+1,hash+cnt+1,a[i])-hash; } int tot=0; void build(int l,int r,int &rt,int pre,int w) { rt=++tot; sum[rt]=sum[pre]+1; if(l==r)return; int mid=(l+r)>>1; if(w<=mid)rs[rt]=rs[pre],build(l,mid,ls[rt],ls[pre],w); else ls[rt]=ls[pre],build(mid+1
,r,rs[rt],rs[pre],w); } int query(int l,int r,int x,int y,int k) { if(l==r)return l; int mid=l+r>>1,tmp=sum[ls[y]]-sum[ls[x]]; if(tmp>=k)return query(l,mid,ls[x],ls[y],k); else return query(mid+1,r,rs[x],rs[y],k-tmp); } int main() { scanf("%d%d",&n,&m); for
(int i=1;i<=n;i++)scanf("%d",a+i),hash[i]=a[i]; lsh(); // printf("%d\n",cnt);for(int i=1;i<=cnt;i++) printf("%d ",hash[i]); for(int i=1;i<=n;i++) build(1,cnt,root[i],root[i-1],a[i]); for(int i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&k); printf("%d\n",hash[query(1,cnt,root[x-1],root[y],k)]); } return 0; }

luogu P1533 可憐的狗狗