| ||||||||||
| 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 | |||||||||
所以终于写对指针主席树了,网上怎么那么多人不喜欢指针。。。伐开心#include <cstdio>
#include <algorithm>
const int N = 100000 + 5 ;
int a [ N ] , dot [ N ] ;
int n , m , x , y , k ;
struct Node {
int cnt ;
Node * ls , * rs ;
void update ( ) {
cnt = ls -> cnt + rs -> cnt ;
}
}
pool [ N << 5 ] , * tail = pool , * root [ N ] ;
Node * build ( int l , int r ) {
Node * nd = ++ tail ;
if ( l == r ) {
nd -> cnt = 0 ;
return nd ;
}
else {
int mid = l + r >> 1 ;
nd -> ls = build ( l , mid ) ;
nd -> rs = build ( mid + 1 , r ) ;
nd -> update ( ) ;
}
return nd ;
}
Node * insert ( Node * nd , int l , int r , int num ) {
Node * nnd = ++ tail ;
if ( l == r ) {
nnd -> cnt = nd -> cnt + 1 ;
return nnd ;
}
else {
int mid = l + r >> 1 ;
if ( num <= mid ) {
nnd -> ls = insert ( nd -> ls , l , mid , num ) ;
nnd -> rs = nd -> rs ;
}
else {
nnd -> ls = nd -> ls ;
nnd -> rs = insert ( nd -> rs , mid + 1 , r , num ) ;
}
nnd -> update ( ) ;
}
return nnd ;
}
int query ( Node *lnd , Node * rnd , int l , int r , int k ) {
if ( l == r )
return l ;
int mid = l + r >> 1 ;
int lz = rnd -> ls -> cnt - lnd -> ls -> cnt ;
if ( k <= lz ) return query ( lnd -> ls , rnd -> ls , l , mid , k ) ;
else return query ( lnd -> rs , rnd -> rs , mid + 1 , r , k - lz ) ;
}
int main ( ) {
freopen ( "test.in" , "r" , stdin ) ;
scanf ( "%d%d" , & n , & m ) ;
for ( int i = 1 ; i <= n ; i ++ ) {
scanf ( "%d" , & a [ i ] ) ;
dot [ i ] = a [ i ] ;
}
std :: sort ( dot + 1 , dot + n + 1 ) ;
int tot = std :: unique ( dot + 1 , dot + n + 1 ) - dot - 1 ;
root [ 0 ] = build ( 1 , tot ) ;
for ( int i = 1 ; i <= n ; i ++ ) {
int dd = std :: lower_bound ( dot + 1 , dot + tot + 1 , a [ i ] ) - dot ;
root [ i ] = insert ( root [ i - 1 ] , 1 , tot , dd ) ;
}
for ( int i = 1 ; i <= m ; i ++ ) {
scanf ( "%d%d%d" , & x , & y , & k ) ;
printf ( "%d\n" , dot [ query ( root [ x - 1 ] , root [ y ] , 1 , tot , k ) ] ) ;
}
return 0 ;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator