记录编号 |
583178 |
评测结果 |
AAAAAAAAAA |
题目名称 |
高级打字机 |
最终得分 |
100 |
用户昵称 |
┭┮﹏┭┮ |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.161 s |
提交时间 |
2023-10-05 17:26:42 |
内存使用 |
15.27 MiB |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n;
struct made{
int ls,rs,size;
char ch;
}t[N<<4];
int root[N],cnt,tot;
void build(int &x,int l,int r){
x = ++tot;
t[x].size = 0;
if(l == r)return;
int mid = l + r >> 1;
build(t[x].ls,l,mid);
build(t[x].rs,mid+1,r);
}
void add(int la,int &now,int l,int r,char ch){
now = ++tot;
t[now] = t[la];
if(l == r){
t[now].size = 1;
t[now].ch = ch;
return;
}
int mid = l + r >> 1;
if(t[t[la].ls].size < mid-l+1)add(t[la].ls,t[now].ls,l,mid,ch);
else add(t[la].rs,t[now].rs,mid+1,r,ch);
t[now].size = t[t[now].ls].size + t[t[now].rs].size;
}
char ask(int now,int l,int r,int x){
if(l == r)return t[now].ch;
int mid = l + r >> 1;
if(x <= t[t[now].ls].size)return ask(t[now].ls,l,mid,x);
else return ask(t[now].rs,mid+1,r,x-t[t[now].ls].size);
}
int main(){
freopen("type.in","r",stdin);
freopen("type.out","w",stdout);
scanf("%d",&n);
build(root[0],1,n);
for(int i = 1;i <= n;i++){
char c[3],cc[3];scanf("%s",c);
int x;
if(c[0] == 'T'){
scanf("%s",cc);
++cnt;
add(root[cnt-1],root[cnt],1,n,cc[0]);
}
else if(c[0] == 'Q'){
scanf("%d",&x);
printf("%c\n",ask(root[cnt],1,n,x));
}
else{
scanf("%d",&x);
cnt++;
root[cnt] = root[cnt-x-1];
}
}
return 0;
}