刚学OI的萌新求助
查看原帖
刚学OI的萌新求助
544446
Demon_master楼主2022/3/10 00:03

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn = 100000+231;

struct TREE{
	int l,r,num,k;
}tree[maxn*30];
int f[maxn],cnt=0;

inline ll read_int(){
    ll a=0,f=1,g=getchar();
    while(g<'0'||g>'9'){if(g=='-') f=-1;g=getchar();}
    while(g>='0'&&g<='9') a=a*10+g-'0',g=getchar();
    return a*f;
}

inline void write(ll a,ll b){
	if(a<0) a=-a,putchar('-');
	ll lin[40],cnt=0;
	while(a) lin[++cnt]=a%10,a/=10;
	if(!cnt) cnt++,lin[cnt]=0;
	while(cnt) putchar(lin[cnt]+'0'),cnt--;
	if(b) putchar('\n');
}

void build(int & num,int l,int r){
	if(!num) num=++cnt;
	if(l==r) return;
	int mid=(l+r)>>1;
	build(tree[num].l,l,mid);
	build(tree[num].r,mid+1,r);
}

void add(int num,int & newnum,int l,int r,int ads,int C){
	if(!newnum) newnum=++cnt;
	if(l==r) {tree[newnum].num=C,tree[newnum].k=1;return;}
	int mid=(l+r)>>1;
	if(ads<=mid) add(tree[num].l,tree[newnum].l,l,mid,ads,C),tree[newnum].r=tree[num].r;
	else add(tree[num].r,tree[newnum].r,mid+1,r,ads,C),tree[newnum].l=tree[num].l;
	tree[newnum].k=tree[tree[newnum].l].k+tree[tree[newnum].r].k;
	return;
}

int ask(int num,int l,int r,int k){
	if(l==r) return tree[num].num;
	int mid=(l+r)>>1;
	if(k<=mid) return ask(tree[num].l,l,mid,k);
	else return ask(tree[num].r,mid+1,r,k);
}

int n,kkksc03=0;
inline void read(){
	n=read_int();
	build(kkksc03,1,n);
	f[0]=1;
	for(int i=1,jl=0;i<=n;i++){
		int k=getchar(),C;
		while(!(k=='T'||k=='Q'||k=='U')) k=getchar();
		C=getchar();
		while(!(('a'<=C&&C<='z')||('0'<=C&&C<='9'))) C=getchar();
		if(k=='T'){
			jl++;
			add(f[jl-1],f[jl],1,n,tree[f[jl-1]].k+1,C);
		}
		else if(k=='Q'){
			putchar(ask(f[jl],1,n,C-'0'));
			putchar('\n');
		}
		else{
			jl++;
			f[jl]=f[jl-(C-'0')-1];
		}
	}
}

int main(){
	read();
}

谢谢各位大佬

2022/3/10 00:03
加载中...