• 模板:主席树


    主席树模板

    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;
    }
    
    「我不敢下苦功琢磨自己,怕终于知道自己并非珠玉;然而心中既存着一丝希冀,便又不肯甘心与瓦砾为伍。」
  • 相关阅读:
    程序员到底该怎么给女朋友挑礼物
    漫说测试 | 研发虐我千百遍,我待bug如初恋
    知识是有价值的
    如何防止ASP.NET网站遭受CSRF的攻击
    如何让ASP.NET网站站点不停止 永远持续运行
    在ASP.NET MVC中验证checkbox 必须选中 (Validation of required checkbox in Asp.Net MVC)
    SOA和Web Service介绍
    ASP.NET网站如何显示自己的网页图标
    ASP.NET(C#)中的try catch异常处理机制
    Session.Abandon, Session.Clear和Session.Remove的区别
  • 原文地址:https://www.cnblogs.com/Apocrypha/p/9430655.html
Copyright © 2020-2023  润新知