| #include <bits/stdc++.h> |
| using namespace std; |
| |
| const int maxN = 1e6+10; |
| |
| int roots[maxN*30]; |
| int cnt; |
| int A[maxN]; |
| |
| struct Tree{ |
| struct Node{ |
| int val; |
| int lson; |
| int rson; |
| Node(int val=0,int lson=0,int rson=0):val(val),lson(lson),rson(rson){}; |
| }node[maxN*30]; |
| |
| void build(int &root,int l,int r){ |
| root = ++cnt; |
| if(l == r){ |
| node[root].val = A[l]; |
| return; |
| } |
| int mid = (l + r) >> 1; |
| build(node[root].lson,l,mid); |
| build(node[root].rson,mid+1,r); |
| } |
| |
| inline int clone(int k){ |
| node[++cnt] = node[k]; |
| return cnt; |
| } |
| |
| int update(int root,int l,int r,int x,int val){ |
| root = clone(root); |
| if(l == r){ |
| node[root].val = val; |
| }else{ |
| int mid = (l + r) >> 1; |
| if(x <= mid){ |
| node[root].lson = update(node[root].lson,l,mid,x,val); |
| }else{ |
| node[root].rson = update(node[root].rson,mid+1,r,x,val); |
| } |
| } |
| return root; |
| } |
| |
| int Query(int root,int l,int r,int x){ |
| if(l == r) return node[root].val; |
| int mid = (l + r) >> 1; |
| if(x <= mid) return Query(node[root].lson,l,mid,x); |
| else return Query(node[root].rson,mid+1,r,x); |
| } |
| }SegmentTree; |
| |
| int main(){ |
| int N,M; |
| scanf("%d%d",&N,&M); |
| for(int i = 1;i<=N;i++) scanf("%d",&A[i]); |
| SegmentTree.build(roots[0],1,N); |
| for(int i = 1;i<=M;i++){ |
| int v,opt,loc,val; |
| scanf("%d%d%d",&v,&opt,&loc); |
| if(opt & 1){ |
| scanf("%d",&val); |
| roots[i] = SegmentTree.update(roots[v],1,N,loc,val); |
| }else{ |
| int ans = SegmentTree.Query(roots[v],1,N,loc); |
| printf("%d\n",ans); |
| roots[i] = roots[v]; |
| } |
| } |
| return 0; |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库