#include<bits/stdc++.h>
using namespace std;
streambuf* inbuf;
struct SegmentTreeNode{
SegmentTreeNode* left=nullptr;
SegmentTreeNode* right=nullptr;
int value,l,r;
SegmentTreeNode(int i,int j){
value=i;
l=j;
r=j;
}
SegmentTreeNode(){
value=0;
l=0;
r=0;
}
SegmentTreeNode(vector<int>& sequence){
build(1,sequence.size(),sequence);
}
SegmentTreeNode* modify(int index,int mod){
if(l==r){
return new SegmentTreeNode{mod,index};
}
int mid=(l+r)>>1;
SegmentTreeNode* ptr=new SegmentTreeNode;
ptr->l=l;
ptr->r=r;
if(index<=mid){
ptr->left=left->modify(index,mod);
ptr->right=right;
}else{
ptr->right=right->modify(index,mod);
ptr->left=left;
}
return ptr;
}
int query(int index){
if(l==r){
return value;
}
int mid=(l+r)>>1;
if(index<=mid){
return left->query(index);
}else{
return right->query(index);
}
}
private:
void build(int l,int r,vector<int>& sequence){
this->l=l;
this->r=r;
if(l==r){
value=sequence[l-1];
return;
}
int mid=(l+r)>>1;
left=new SegmentTreeNode;
right=new SegmentTreeNode;
left->build(l,mid,sequence);
right->build(mid+1,r,sequence);
}
};
int qr(){
char ch=inbuf->sbumpc();
bool sign=1;
int abs=0;
while(ch>'9'||ch<'0'){
if(ch=='-'){
sign=0;
}
ch=inbuf->sbumpc();
}
while(ch<='9'&&ch>='0'){
abs=(abs<<3)+(abs<<1)+(ch^48);
ch=inbuf->sbumpc();
}
return sign?abs:-abs;
}
vector<SegmentTreeNode*> version;
int main(){
version.reserve(19198100);
ios::sync_with_stdio(false);
cin.tie(nullptr);
inbuf=cin.rdbuf();
int N{qr()},M{qr()};
vector<int> sequence(N);
for(int i=0;i<N;i++){
sequence[i]=qr();
}
version.push_back(new SegmentTreeNode{sequence});
while(M--){
int vi{qr()},op{qr()};
if(op==1){
int loc{qr()},value{qr()};
version.push_back(version[vi]->modify(loc,value));
}else{
int loc{qr()};
cout<<version[vi]->query(loc)<<"\n";
version.push_back(version[vi]);
}
}
}
萌新刚学OI,用的指针实现可持久化线段树,T飞两个点,求助