P3919 【模板】可持久化线段树 1(可持久化数组)
链接
(主席树板子, 注意读题)
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
struct node
{
int l ,r ;
long long k ;
}tr[N * 4 + N * 20 ];
long long w[N] ;
int root[N] , idx ;
int n , m ;
template<typename T>inline void read(T &a) {
char c = getchar(); T x = 0, f = 1; while (!isdigit(c)) {if (c == '-')f = -1; c = getchar();}
while (isdigit(c)) {x = (x << 1) + (x << 3) + c - '0'; c = getchar();} a = f * x;
}
int build(int l , int r )
{
int p = ++idx ;
if(l == r )
{
tr[p].k = w[l] ;
return p ;
}
int mid = l + r >> 1 ;
tr[p].l = build(l , mid ) ;
tr[p].r = build(mid + 1 , r ) ;
return p ;
}
int modify(int p , int l , int r , int u , long long w)
{
int q = ++idx;
tr[q] = tr[p];
if(l == r )
{
tr[q].k = w ;
return q;
}
int mid = l + r >> 1;
if(u <= mid ) tr[q].l = modify(tr[p].l , l , mid , u , w ) ;
else tr[q].r = modify(tr[p].r , mid + 1 , r , u ,w ) ;
return q ;
}
long long query(int p , int l ,int r , int v )
{
if(l == r ) return tr[p].k;
int mid = l + r >> 1 ;
if(v<= mid ) return query(tr[p].l ,l , mid, v ) ;
else return query(tr[p].r ,mid + 1 , r ,v ) ;
}
int main()
{
//cout<<"120" ;
read(n) , read(m) ;
for(int i = 1 ; i <= n ; i ++ ) read(w[i]);
root[0] = build(1 , n) ;
int z = 0 ;
int op ;
while(m -- )
{
int v ;
read(v) ;
read(op) ;
if(op == 1)
{
int p ;
long long u ;
read(p) ,read(u) ;
root[++z] = modify(root[v] , 1 , n , p, u ) ;
}
else
{
int p ;
read(p) ;
root[++z] = root[v] ;
cout<<query(root[v] , 1 , n , p ) <<endl;
}
}
return 0 ;
}