转主席树代码

 1 #include
 2 #include
 3 using namespace std;
 4 const int N=2e5+10;
 5 const int M=N*10;
 6 struct President_Tree{
 7     int L,R,sum;
 8 }T[M<<1];
 9 int last[N],top[M],root[N];
10 int n,m,T_cnt=1;
11 int read(){
12     int x=0,f=1;char ch=getchar();
13     while (ch<'0' || ch>'9'){if (ch=='-')f=-1;ch=getchar();}
14     while ('0'<=ch && ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
15     return x*f;
16 }
17 void insert(int &now,int x,int l=0,int r=n){
18     T[T_cnt++]=T[now];now=T_cnt-1;
19     T[now].sum++;
20     if (l==r)return;
21     int mid=(l+r)>>1;
22     if (x<=mid)insert(T[now].L,x,l,mid);
23         else insert(T[now].R,x,mid+1,r);
24 }
25 int query(int i,int j,int qr,int l=0,int r=n){
26     if (r<=qr)return T[j].sum-T[i].sum;
27     int mid=(l+r)>>1,t=query(T[i].L,T[j].L,qr,l,mid);
28     if (mid

你可能感兴趣的:(主席树)