zoukankan      html  css  js  c++  java
  • Luogu_P3834 【模板】可持久化线段树 2(主席树)

    #include <bits/stdc++.h>
    using namespace std;
    const int N=200010;
    int lc[N<<5],rc[N<<5],rt[N<<5],sum[N<<5],a[N],b[N],n,m,q,p,sz;
    
    void build(int& rt,int l,int r){
    	rt=++sz; sum[rt]=0;
    	if(l==r)return;
    	int mid=l+r>>1;
    	build(lc[rt],l,mid);
    	build(rc[rt],mid+1,r);
    }
    
    int update(int o,int l,int r){
    	int oo=++sz;
    	lc[oo]=lc[o]; rc[oo]=rc[o]; sum[oo]=sum[o]+1;
    	if(l==r)return oo;
    	int mid=l+r>>1;
    	if(mid>=p)lc[oo]=update(lc[o],l,mid);
    	else rc[oo]=update(rc[o],mid+1,r);
    	return oo;
    }
    
    int quire(int u,int v,int l,int r,int k){
    	int mid=l+r>>1,x=sum[lc[v]]-sum[lc[u]];
    	if(l==r)return l;
    	if(x>=k)return quire(lc[u],lc[v],l,mid,k);
    	else return quire(rc[u],rc[v],mid+1,r,k-x);
    }
    
    int main(){
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;i++){scanf("%d",&a[i]);b[i]=a[i];}
    	sort(b+1,b+n+1);
    	q=unique(b+1,b+n+1)-b-1;
    	build(rt[0],1,q);
    	for(int i=1;i<=n;i++){
    		p=lower_bound(b,b+q+1,a[i])-b;
    		rt[i]=update(rt[i-1],1,q);
    	}
    	while(m--){
    		int l,r,k;
    		scanf("%d%d%d",&l,&r,&k);
    		printf("%d
    ",b[quire(rt[l-1],rt[r],1,q,k)]);
    	}
    	return 0;
    } 
    

      

  • 相关阅读:
    my first android test
    VVVVVVVVVV
    my first android test
    my first android test
    my first android test
    ini文件
    ZZZZ
    Standard Exception Classes in Python 1.5
    Python Module of the Week Python Module of the Week
    my first android test
  • 原文地址:https://www.cnblogs.com/codetogether/p/13452676.html
Copyright © 2011-2022 走看看