| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
离散化+主席树模版题跟2104一个模子,就是数据范围变大了一丢丢
辣鸡代码:
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <sstream>
#include <cstring>
#include <cmath>
using namespace std;
#define CLR(x,y) memset(x,y,sizeof(x))
#define MID(x,y) ((x+y)>>1)
typedef pair<int,int> pii;
const int N=100010;
struct seg
{
int lson,rson;
int cnt;
};
seg T[N*20];
int tot,arr[N],root[N];
vector<int>pos;
void init()
{
tot=0;
CLR(root,0);
pos.clear();
}
void build(int &cur,int l,int r)
{
cur=++tot;
T[cur].cnt=0;
if(l==r)
return ;
int mid=MID(l,r);
build(T[cur].lson,l,mid);
build(T[cur].rson,mid+1,r);
}
void update(int &cur,int ori,int l,int r,int val)
{
cur=++tot;
T[cur]=T[ori];
++T[cur].cnt;
if(l==r)
return ;
int mid=MID(l,r);
if(val<=mid)
update(T[cur].lson,T[ori].lson,l,mid,val);
else
update(T[cur].rson,T[ori].rson,mid+1,r,val);
}
int query(int S,int E,int l,int r,int k)
{
if(l==r)
return l;
int mid=MID(l,r);
int cnt=T[T[E].lson].cnt-T[T[S].lson].cnt;
if(k<=cnt)
return query(T[S].lson,T[E].lson,l,mid,k);
else
return query(T[S].rson,T[E].rson,mid+1,r,k-cnt);
}
int main(void)
{
int n,m,i,L,R,K;
while (~scanf("%d%d",&n,&m))
{
init();
for (i=1; i<=n; ++i)
{
scanf("%d",arr+i);
pos.push_back(arr[i]);
}
sort(pos.begin(),pos.end());
pos.erase(unique(pos.begin(),pos.end()),pos.end());
int SZ=(int)pos.size();
build(root[0],1,SZ);
for (i=1; i<=n; ++i)
{
arr[i]=lower_bound(pos.begin(),pos.end(),arr[i])-pos.begin()+1;
update(root[i],root[i-1],1,SZ,arr[i]);
}
while (m--)
{
scanf("%d%d%d",&L,&R,&K);
int indx=query(root[L-1],root[R],1,SZ,K)-1;
printf("%d\n",pos[indx]);
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator