主席树模板

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;
}

以上是关于主席树模板的主要内容,如果未能解决你的问题,请参考以下文章

Yangk's 静态主席树-模板

主席树模板

P3834 模板可持久化线段树 1(主席树)

POJ 2104 K-th Number 主席树模板题

LUOGU P3834 模板可持久化线段树 1(主席树)

主席树模板