主席树求助
  • 板块学术版
  • 楼主_Ch1F4N_
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/7/15 10:01
  • 上次更新2023/10/27 20:16:23
查看原帖
主席树求助
520748
_Ch1F4N_楼主2022/7/15 10:01

大红大紫(雾)只有24分

#include<bits/stdc++.h>
using namespace std;
struct node{
	int val;
	int left;
	int right;
}tree[10000001];
int top,n;
int roat[10000001];
int sr;
int bulid(int num,int l,int r)
{
	num=++top;
	if(l==r)
	{
		cin>>tree[num].val;
	}
	else
	{
			
	int mid=(l+r)/2;
	tree[num].left=bulid(num/2,l,mid);
	tree[num].right=bulid(num/2+1,mid+1,r);
	}
	return num;
}
int update(int num,int l,int r,int x,int val)
{
	top++;
	tree[top]=tree[num];
	num=top;
	if(l==r)
	{
		tree[top].val=val;
	}
	else
	{
		int mid=(l+r)/2;
		if(x<=mid)
		{
		update(tree[num].left,l,mid,x,val);
		}
		else
		{
			update(tree[num].right,mid+1,r,x,val);
		}
	}
	return num;
}
int ask(int num,int l,int r,int x)
{
	if(l==r)
	{
		return tree[num].val;
	}
	else
	{
	int mid=(l+r)/2;
		if(x<=mid)
		{
		return ask(tree[num].left,l,mid,x);
		}
		else
		{
		return ask(tree[num].right,mid+1,r,x);
		}
	} 
}
int main()
{
	int n,m;
	cin>>n>>m;
	roat[0]=bulid(0,1,n);
//	cout<<1<<endl;
	for(int i=1;i<=m;i++)
	{
		int v,c;
		cin>>v>>c;
		if(c==1)
		{
			int x,y;
			cin>>x>>y;
			roat[i]=update(roat[v],1,n,x,y);
		}
		else
		{
			int x;
			cin>>x;
			cout<<ask(roat[v],1,n,x)<<endl;
			roat[i]=roat[v];
		}
	}
	return 0;
 } 
2022/7/15 10:01
加载中...