主席树 ,划分树

 1 #include<bits/stdc++.h> 
 2 using namespace std;
 3 const int M = 1e5 + 10 ;
 4 int n , m ;
 5 pair<int , int> a[M] ;
 6 int rk[M] ;
 7 struct node {
 8     int l , r , sum ;
 9 } nd[M * 20] ;
10 int cnt = 0 ;
11 int rt[M] ;
12 
13 void IN (int x , int &o , int l , int r) {
14     nd[cnt] = nd[o] ;
15     nd[cnt].sum ++ ;
16     o = cnt ++ ;
17     if (l == r) return ;
18     int mid = (l + r) >> 1 ;
19     if (x <= mid) IN (x , nd[o].l , l , mid ) ;
20     else IN (x , nd[o].r , mid + 1 , r) ;
21 }
22 
23 int query (int o1 , int o2 , int k , int l , int r) {
24     if (l == r) return l ;
25     int t = nd[nd[o2].l].sum - nd[nd[o1].l].sum ;
26     printf ("t = %d\n" , t ) ;
27     int mid = (l + r) >> 1 ;
28     if (k <= t) return query (nd[o1].l , nd[o2].l , k , l , mid ) ;
29     else return query (nd[o1].r , nd[o2].r , k - t , mid + 1 , r ) ;
30 }
31 
32 int main () { 
33     while (~ scanf ("%d%d" , &n , &m) ) {
34         cnt = 0 ; 
35         for (int i = 1 ; i <= n ; i ++) {
36             scanf ("%d" , &a[i].first ) ;
37             a[i].second = i ;
38         }
39         sort (a + 1 , a + n + 1) ;
40         for (int i = 1 ; i <= n ; i ++) rk[a[i].second] = i ;
41         for (int i = 1 ; i <= n ; i ++) {
42             rt[i] = rt[i - 1] ;
43             IN (rk[i] , rt[i] , 1 , n ) ;
44         }
45         while (m --) {
46             int l , r , k ;
47             scanf ("%d%d%d" , &l , &r , &k ) ;
48             printf ("%d\n" , a[query ( rt[l-1] , rt[r] , k , 1 , n )].first) ;
49         }
50     }
51     return 0 ;
52 }
主席树

http://www.freemeepo.com/acm/1410.html

转载于:https://www.cnblogs.com/get-an-AC-everyday/p/4646724.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值