0分求调!
提交记录
#include <cstdio>
#define N 1000001
#define rep(i,a,b) for(int i(a);i<=(b);++i)
using namespace std;
struct Node{int l,r,v;} t[N<<5];
int a[N],hd[N],l;
inline void read(int &x)
{
int f=1,c;
while((c=getchar())<'0'||c>'9') if(c=='-') f=-1;
for(x=c^48;(c=getchar())>='0'&&c<='9';x=(x<<3)+(x<<1)+(c^48));
x*=f;
}
int build(int pl,int pr)
{
int rt=++l;
if(pl==pr)
{
t[rt].v=a[pr];
return rt;
}
int mid=pl+pr>>1;
t[rt].l=build(pl,mid);
t[rt].r=build(mid+1,pr);
return rt;
}
int query(int pos,int p,int pl,int pr)
{
//printf("query %d %d %d %d\n",pos,p,pl,pr);
if(pl==pr)
{
return t[p].v;
}
int mid=pl+pr>>1;
if(pos<=mid) query(pos,t[p].l,pl,mid);
else query(pos,t[p].r,mid+1,pr);
}
int update(int pos,int val,int p,int pl,int pr)
{
int rt=++l;
t[rt]=t[p];
if(pl==pr)
{
t[rt].v=val;
return rt;
}
int mid=pl+pr>>1;
if(pos<=mid) t[rt].l=update(pos,val,t[p].l,pl,mid);
else t[rt].r=update(pos,val,t[p].r,mid+1,pr);
return rt;
}
// void print()
// {
// printf("==================\n");
// rep(i,1,l)
// {
// printf("Node %d ls:%d rs:%d val:%d\n",i,t[i].l,t[i].r,t[i].v);
// }
// rep(i,0,10)
// {
// printf("Verson %d : %d\n",i,hd[i]);
// }
// }
int main()
{
int n,m,ver,opt,pos,val,ans;
read(n),read(m);
rep(i,1,n) read(a[i]);
hd[0]=build(1,n);
//print();
rep(i,1,m)
{
read(ver),read(opt);
if(opt==1)
{
read(pos),read(val);
hd[i]=update(pos,val,hd[ver],1,n);
//print();
}
else
{
read(pos);
printf("%d\n",query(pos,hd[ver],1,n));
hd[i]=hd[ver];
}
}
return 0;
}
自己算了一下空间,才360MB,不应该MLE啊?