您的位置:首页 > 其它

POJ 2104主席树

2014-12-03 01:08 204 查看
/*************************************************************************
> File Name: cf.cpp
> Author: acvcla
> QQ:
> Mail: acvcla@gmail.com
> Created Time: 1949Äê10ÔÂ1ÈÕ ÐÇÆÚÒ» 0ʱ0·Ö0Ãë
************************************************************************/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<cstring>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<cstdlib>
#include<ctime>
#include<set>
#include<math.h>
using namespace std;
typedef long long LL;
const int maxn = 1e5 + 10;
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define pb push_back
int tot,n,m,date[maxn],sorted[maxn],root[maxn];
struct chairTnode
{
int s,rc,lc;
chairTnode(int s=0,int lc=0,int rc=0):s(s),lc(lc),rc(rc){}
};
chairTnode chairT[maxn*20];
int newnode(int sum,int lson,int rson)
{
int rt=++tot;
chairT[rt]=chairTnode(sum,lson,rson);
return rt;
}
void Insert(int &rt,int pre_rt,int pos,int L,int R)
{
chairTnode &t=chairT[pre_rt];
rt=newnode(t.s+1,t.lc,t.rc);
if(L==R)return;
int mid=(L+R)>>1;
if(pos<=mid)Insert(chairT[rt].lc,t.lc,pos,L,mid);
else Insert(chairT[rt].rc,t.rc,pos,mid+1,R);
}
int Query(int ql,int qr,int L,int R,int k)
{
if(L==R)return L;
int sum=chairT[chairT[qr].lc].s-chairT[chairT[ql].lc].s;
int mid=(L+R)>>1;
if(k<=sum)return Query(chairT[ql].lc,chairT[qr].lc,L,mid,k);
return Query(chairT[ql].rc,chairT[qr].rc,mid+1,R,k-sum);
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
rep(i,1,n){
scanf("%d",date+i);
sorted[i]=date[i];
}
tot=root[0]=0;
sort(sorted+1,sorted+1+n);
int cnt=unique(sorted+1,sorted+1+n)-sorted-1;
for(int i=1;i<=n;i++){
int pos=lower_bound(sorted+1,sorted+1+n,date[i])-sorted;
Insert(root[i],root[i-1],pos,1,cnt);
}
int ql,qr,k;
while(m--)
{
scanf("%d%d%d",&ql,&qr,&k);
printf("%d\n",sorted[Query(root[ql-1],root[qr],1,cnt,k)]);
}
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: