提交记录 88分,求调(码风可能有点奇怪)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=1000006,MAXM=1000006;
int a[MAXN],top=1;
int head[MAXM];
struct Node
{
int v;
int l,r;
int lc,rc;
} d[MAXN*2*16];
int clone(int p)
{
top++;
d[top]=d[p];
return top;
}
void build(int l,int r,int p)
{
int mid=(l+r)/2;
d[p].l=l;
d[p].r=r;
d[p].lc=++top;
d[p].rc=++top;
if(l>=r)
{
d[p].v=a[mid];
return;
}
build(l,mid,d[p].lc);
build(mid+1,r,d[p].rc);
d[p].v=d[d[p].lc].v+d[d[p].rc].v;
}
int query(int l,int r,int p)
{
int L=d[p].l,R=d[p].r;
if(L>=l && R<=r)
{
return d[p].v;
}
if(L>=R)
{
return d[p].v;
}
int mid=(L+R)/2;
int ans=0;
if(l<=mid)
{
ans+=query(l,r,d[p].lc);
//return query(l,r,d[p].lc);
}
else if(r>mid)
{
ans+=query(l,r,d[p].rc);
//return query(l,r,d[p].rc);
}
return ans;
}
int add(int s,int q,int P)
{
int p=clone(P);
int L=d[p].l,R=d[p].r;
if(L>=R)
{
d[p].v=q;
return p;
}
int mid=(L+R)/2;
if(s<=mid)
{
d[p].lc=add(s,q,d[p].lc);
}
else if(s>mid)
{
d[p].rc=add(s,q,d[p].rc);
}
d[p].v=d[d[p].lc].v+d[d[p].rc].v;
return p;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++)
{
cin>>a[i];
}
head[0]=top;
build(1,n,1);
for(int i=1; i<=m; i++)
{
int q,x,y,z;
cin>>z>>q;
head[i]=top+1;
//clone(z);
if(q==2)
{
cin>>x;
//Sleep(8000);
clone(head[z]);
cout<<query(x,x,clone(head[z]))<<endl;
}
if(q==1)
{
cin>>x>>y;
add(x,y,head[z]);
}
}
return 0;
}