POJ--2104 K-th Number (主席树模版题)

时间:2023-03-09 22:46:41
POJ--2104 K-th Number (主席树模版题)

题目链接

求区间第k大

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<stdio.h>
using namespace std;
#define maxn 100009
#define LL long long
#define mem(a,b) memset(a,b,sizeof(a))
struct ac{
   int va,l,r;
}tre[maxn*];
;
vector<int>q;
int getid(int x){
   );
}
void updata(int l,int r,int &x,int y,int z){
   tre[++tot]=tre[y];
   tre[tot].va++;
   x=tot;
   if(l==r) return ;
   ;
   if(z>mid){
      updata(mid+,r,tre[x].r,tre[y].r,z);
   }else updata(l,mid,tre[x].l,tre[y].l,z);
}
int query(int l,int r,int x,int y,int z){
  if(l==r) return l;
  int s=tre[tre[x].l].va-tre[tre[y].l].va;
  ;
  if(s>=z){
      return query(l,mid,tre[x].l,tre[y].l,z);
  }
  ,r,tre[x].r,tre[y].r,z-s);
}
int main(){
   int n,m;
   cin>>n>>m;
   mem(a,); mem(tre,);
   ;j<=n;j++){
      scanf("%d",&a[j]);
      q.push_back(a[j]);
   }
   sort(q.begin(),q.end());
   q.erase(unique(q.begin(),q.end()),q.end());
   int len=q.size();
   ;j<=n;j++){
       int x=getid(a[j]);
       updata(,len,root[j],root[j-],x);
   }
   ;j<m;j++){
     int l,r,x;
     scanf("%d%d%d",&l,&r,&x);
     cout<<q[query(,len,root[r],root[l-],x)-]<<endl;
   }
}