社区讨论
求助关于线段树建树
学术版参与者 2已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @loclup00
- 此快照首次捕获于
- 2023/10/30 15:55 2 年前
- 此快照最后确认于
- 2023/11/05 03:03 2 年前
RT,在写可持久化线段树,结果连建树都不会了……
不知道为啥REQAQ(build)
CPP#include <stdio.h>
#include <string.h>
inline int read()
{
int num=0,f=1;char c=getchar();
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>47&&c<58)num=num*10+(c^48),c=getchar();
return num*f;
}
int a[4000005];
struct Node{
public:
Node *lc,*rc;
int x;
Node()
{
lc=rc=NULL;
x=0;
}
};
Node* p[100005];
void build(Node *o,int l,int r)
{
printf("%d %d\n",l,r);
if(l==r)
{
o->x=a[l];
o->lc=o->rc=NULL;
return;
}
o->lc=new Node();//这里赋值的时候炸了
o->rc=new Node();//这里赋值的时候炸了
int m=l+r>>1;
build(o->lc,l,m);
build(o->rc,m+1,r);
}
void add(Node* o,int l,int r,int pos,int x,Node *q)
{
if(l==r)
{
o->x=x;
o->lc=o->rc=NULL;
return;
}
int m=l+r>>1;
if(pos<=m)
{
add(o->lc,l,m,pos,x,q->lc);
o->rc=q->rc;
}
else
{
add(o->rc,m+1,r,pos,x,q->rc);
o->lc=q->lc;
}
}
int query(Node *o,int l,int r,int pos)
{
if(l==r)return o->x;
int m=l+r>>1;
return pos<=m?query(o->lc,l,m,pos):query(o->rc,m+1,r,pos);
}
int main()
{
int n=read(),T=read();
int m=1;while(m<n)m<<=1;
for(int i=1;i<=n;i++)a[i]=read();
build(p[0],1,m);
for(int i=1;i<=T;i++)
{
int v=read(),op=read(),loc=read();
if(op==1)
{
int val=read();
add(p[i],1,m,loc,val,p[v]);
}
else
{
printf("%d\n",query(p[v],1,m,loc));
p[i]=p[v];
}
}
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...