zoukankan      html  css  js  c++  java
  • 模板:主席树

    主席树模板

    code:

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    bool Finish_read;
    template<class T>inline void read(T &x){Finish_read=0;x=0;int f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;if(ch==EOF)return;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();x*=f;Finish_read=1;}
    template<class T>inline void print(T x){if(x/10!=0)print(x/10);putchar(x%10+'0');}
    template<class T>inline void writeln(T x){if(x<0)putchar('-');x=abs(x);print(x);putchar('
    ');}
    template<class T>inline void write(T x){if(x<0)putchar('-');x=abs(x);print(x);}
    /*================Header Template==============*/
    #define PAUSE printf("Press Enter key to continue..."); fgetc(stdin);
    const int maxn=2e5+500;
    #define fi first
    #define se second
    typedef std::map<int,int>::iterator Mpit;
    int n,m,cnt;
    int a[maxn],v[maxn],rt[maxn];
    std::map<int,int>Mp;
    /*==================Define Area================*/
    namespace PersistentSegmentTree {
    	struct node {
    		int ls,rs,l,r;
    		int val;
    	}t[maxn<<6];
    	int tot;
    	void Update(int o) {
    		t[o].val=t[t[o].ls].val+t[t[o].rs].val;
    	}
    	void Build(int o,int l,int r) {
    		t[o].l=l;t[o].r=r;
    		if(l==r) return ;
    		int mid=(l+r)>>1;
    		Build(t[o].ls=++tot,l,mid);
    		Build(t[o].rs=++tot,mid+1,r);
    		return ;
    	}
    	void Modify(int newrt,int rt,int x,int v) {
    		t[newrt]=t[rt];
    		if(t[newrt].l==t[newrt].r) {
    			t[newrt].val+=v;
    			return ;
    		}
    		if(x<=t[t[newrt].ls].r) Modify(t[newrt].ls=++tot,t[rt].ls,x,v);
    		else Modify(t[newrt].rs=++tot,t[rt].rs,x,v);
    		Update(newrt);
    	}
    	int Query(int Lrt,int Rrt,int l,int r,int k) {
    		if(l==r) return v[l];
    		int mid=(l+r)>>1;
    		int x=t[t[Rrt].ls].val-t[t[Lrt].ls].val;
    		if(k<=x) return Query(t[Lrt].ls,t[Rrt].ls,l,mid,k);
    		else return Query(t[Lrt].rs,t[Rrt].rs,mid+1,r,k-x);
    	}
    }
    using namespace PersistentSegmentTree;
    
    int main() {
    	read(n);read(m);
    	for(int i=1;i<=n;i++) {
    		read(a[i]);
    		Mp[a[i]]=1;
    	}
    	for(Mpit it=Mp.begin();it!=Mp.end();++it) {
    		v[++cnt]=it->fi;Mp[it->fi]=cnt;
    	}
    	for(int i=1;i<=n;i++) a[i]=Mp[a[i]];
    	Build(rt[0]==++tot,1,cnt);
    	for(int i=1;i<=n;i++) {
    		Modify(rt[i]=++tot,rt[i-1],a[i],1);
    	}
    	for(int i=1,l,r,k;i<=m;i++) {
    		read(l);read(r);read(k);
    		int ans=Query(rt[l-1],rt[r],1,cnt,k);
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    
    「我不敢下苦功琢磨自己,怕终于知道自己并非珠玉;然而心中既存着一丝希冀,便又不肯甘心与瓦砾为伍。」
  • 相关阅读:
    「CF1380G」 Circular Dungeon
    「CF1208G」 Polygons
    P4827「国家集训队」 Crash 的文明世界
    「CF85E」 Guard Towers
    「BZOJ 2956」模积和
    「HEOI2016/TJOI2016」排序
    CF277E Binary Tree on Plane
    「SDOI2016」数字配对
    HNOI2020「Elegy」
    CSP-S2019「Symphony」
  • 原文地址:https://www.cnblogs.com/Apocrypha/p/9430655.html
Copyright © 2011-2022 走看看