主席树模板
Posted darkroome
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了主席树模板相关的知识,希望对你有一定的参考价值。
随处可见的主席树题目吧- -
题意大一体上就是询问各个版本的区间最大值,修改一个数产生一个新的版本
#include <bits/stdc++.h>
using namespace std;
template<typename T>inline T readin(T&rt) {
char c; T tmp=0,x=1; c=getchar();
while(c>‘9‘ || c<‘0‘) {if(c==‘-‘) x=-1; c=getchar();}
while(c>=‘0‘ && c<=‘9‘) {tmp=tmp*10+c-‘0‘; c=getchar();}
return rt=tmp*x;
}
const int maxN=10000+10;
const int maxQ=100000+10;
int tot=0,maxv[(maxN<<2)*50],lson[(maxN<<2)*50],rson[(maxN<<2)*50];
int n,Q,a[maxN],rot[maxQ],ver;
int newNode(int val,int ls,int rs) {
++tot;
maxv[tot]=val;
lson[tot]=ls; rson[tot]=rs;
return tot;
}
void build(int &o,int l,int r) {
o=++tot;
if(l==r) {
maxv[o]=a[l];
return;
}
else {
int mid=(l+r)>>1;
build(lson[o],l,mid);
build(rson[o],mid+1,r);
maxv[o]=max(maxv[lson[o]],maxv[rson[o]]);
}
}
int Ins(int prert,int l,int r,int pos,int val) {
if(pos>r || pos<l) assert(0);
int o=newNode(maxv[prert],lson[prert],rson[prert]);
if(l==r) {maxv[o]=val; return o;}
int mid=(l+r)>>1;
if(pos<=mid) lson[o]=Ins(lson[prert],l,mid,pos,val);
else rson[o]=Ins(rson[prert],mid+1,r,pos,val);
maxv[o]=max(maxv[lson[o]],maxv[rson[o]]);
return o;
}
int Qmax(int o,int l,int r,int ql,int qr) {
if(ql>r || qr<l) return INT_MIN;
if(ql<=l && r<=qr) return maxv[o];
else {
int mid=(l+r)>>1; int ret=INT_MIN;
if(ql<=mid) ret=max(ret,Qmax(lson[o],l,mid,ql,qr));
if(qr>mid) ret=max(ret,Qmax(rson[o],mid+1,r,ql,qr));
return ret;
}
}
int main() {
readin(n),readin(Q);
for(int i=1;i<=n;i++) readin(a[i]);
build(rot[1],1,n);
int op,k,l,r; ver=1;
for(int z=0;z<Q;z++) {
readin(op),readin(k); readin(l),readin(r);
if(op==0) {
printf("%d
",Qmax(rot[k],1,n,l,r));
}
else {
ver++; rot[ver]=Ins(rot[k],1,n,l,r);
}
}
return 0;
}
以上是关于主席树模板的主要内容,如果未能解决你的问题,请参考以下文章