记录编号 583178 评测结果 AAAAAAAAAA
题目名称 高级打字机 最终得分 100
用户昵称 Gravatar┭┮﹏┭┮ 是否通过 通过
代码语言 C++ 运行时间 0.161 s
提交时间 2023-10-05 17:26:42 内存使用 15.27 MiB
显示代码纯文本
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 1e5+10;
  4. int n;
  5. struct made{
  6. int ls,rs,size;
  7. char ch;
  8. }t[N<<4];
  9. int root[N],cnt,tot;
  10. void build(int &x,int l,int r){
  11. x = ++tot;
  12. t[x].size = 0;
  13. if(l == r)return;
  14. int mid = l + r >> 1;
  15. build(t[x].ls,l,mid);
  16. build(t[x].rs,mid+1,r);
  17. }
  18. void add(int la,int &now,int l,int r,char ch){
  19. now = ++tot;
  20. t[now] = t[la];
  21. if(l == r){
  22. t[now].size = 1;
  23. t[now].ch = ch;
  24. return;
  25. }
  26. int mid = l + r >> 1;
  27. if(t[t[la].ls].size < mid-l+1)add(t[la].ls,t[now].ls,l,mid,ch);
  28. else add(t[la].rs,t[now].rs,mid+1,r,ch);
  29. t[now].size = t[t[now].ls].size + t[t[now].rs].size;
  30. }
  31. char ask(int now,int l,int r,int x){
  32. if(l == r)return t[now].ch;
  33. int mid = l + r >> 1;
  34. if(x <= t[t[now].ls].size)return ask(t[now].ls,l,mid,x);
  35. else return ask(t[now].rs,mid+1,r,x-t[t[now].ls].size);
  36. }
  37. int main(){
  38. freopen("type.in","r",stdin);
  39. freopen("type.out","w",stdout);
  40. scanf("%d",&n);
  41. build(root[0],1,n);
  42. for(int i = 1;i <= n;i++){
  43. char c[3],cc[3];scanf("%s",c);
  44. int x;
  45. if(c[0] == 'T'){
  46. scanf("%s",cc);
  47. ++cnt;
  48. add(root[cnt-1],root[cnt],1,n,cc[0]);
  49. }
  50. else if(c[0] == 'Q'){
  51. scanf("%d",&x);
  52. printf("%c\n",ask(root[cnt],1,n,x));
  53. }
  54. else{
  55. scanf("%d",&x);
  56. cnt++;
  57. root[cnt] = root[cnt-x-1];
  58. }
  59. }
  60. return 0;
  61. }