萌新刚学OI,只A了#1和#3
查看原帖
萌新刚学OI,只A了#1和#3
541916
RiceFruit楼主2022/8/3 16:35

提交记录

代码:

#include<bits/stdc++.h>
using namespace std;
#define R register
#define ri register int
#define ll long long
#define ull unsigned long long
#define lid tree[id].bl
#define rid tree[id].br
void swap(int &x,int &y){int t=x;x=y;y=t;}
inline int max(int x,int y){return x>y?x:y;}
inline int min(int x,int y){return x<y?x:y;}
inline int read();
inline void write(int ans);
inline void put(int x,char c);
const int N=1e6+1;
int n,m;
int a[N];
struct sa{
	int l,r,bl,br;
	int val;
}tree[N<<5];
int root[N*3];
int top;
int build(int id,int l,int r){
	id=++top;
	tree[id].l=l,tree[id].r=r;
	if(l==r){
		tree[id].val=a[l];
		return id;
	}
	int mid=l+r>>1;
	lid=build(lid,l,mid);
	rid=build(rid,mid+1,r);
	return id;
}
int query(int id,int x){
	if(tree[id].l==tree[id].r)return tree[id].val;
	int mid=tree[id].l+tree[id].r>>1;
	if(x<=mid)return query(lid,x);
	else query(rid,x);
}
int update(int id,int x,int k){
	tree[++top]=tree[id];
	id=top;
	if(tree[id].l==tree[id].r){
		tree[id].val=k;
	}
	else{
		int mid=tree[id].l+tree[id].r>>1;
		if(x<=mid){
			lid=update(lid,x,k);
		}
		else{
			rid=update(rid,x,k);
		}
	}
	return id;
}
signed main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	root[0]=build(1,1,n);
	for(int i=1;i<=m;i++){
		int use=read(),op=read();
		if(op==1){
			int x=read(),k=read();
			root[i]=update(root[use],x,k);
		}
		else{
			int x=read();
			put(query(root[use],x),'\n');
			root[i]=root[use];
		}
	}
	return 0;
}
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
inline void write(int x){if(x<0){putchar('-');x=-x;}if(x>9){write(x/10);}putchar(x % 10+'0');return;}
inline void put(int x,char c){write(x);putchar(c);return;}

求大佬帮调

2022/8/3 16:35
加载中...