描述

给一个空数列,有M次操作,每次操作是以下三种之一:

(1)在数列后加一个数

(2)求数列中某位置的值

(3)撤销掉最后进行的若干次操作(1和3)

输入

第一行一个正整数M。 接下来M行,每行开头是一个字符,若该字符为'A',则表示一个加数操作,接下来一个整数x,表示在数列后加一个整数x;若该字符为'Q',则表示一个询问操作,接下来一个整数x,表示求x位置的值;若该字符为'U',则表示一个撤销操作,接下来一个整数x,表示撤销掉最后进行的若干次操作。

输出

对每一个询问操作单独输出一行,表示答案。

样例输入

  1. 9
  2. A 1
  3. A 2
  4. A 3
  5. Q 3
  6. U 1
  7. A 4
  8. Q 3
  9. U 2
  10. Q 3

样例输出

  1. 3
  2. 4
  3. 3

提示

1<=M<=10^5,输入保证合法,且所有整数可用带符号32位整型存储。


  可持久化线段树不解释。

Code

  1. /**
  2. * OpenJudge
  3. * Problem#5822
  4. * Accepted
  5. * Time: 846ms
  6. * Memory: 144000k
  7. */
  8. #include <iostream>
  9. #include <fstream>
  10. #include <sstream>
  11. #include <cstdio>
  12. #include <cstring>
  13. #include <cctype>
  14. #include <cstdlib>
  15. #include <ctime>
  16. #include <algorithm>
  17. #include <map>
  18. #include <set>
  19. #include <stack>
  20. #include <vector>
  21. #include <queue>
  22. using namespace std;
  23.  
  24. const int segsize = ;
  25.  
  26. typedef class SegTreeNode {
  27. public:
  28. int val;
  29. SegTreeNode *l, *r;
  30.  
  31. SegTreeNode():val() { }
  32. }SegTreeNode;
  33.  
  34. SegTreeNode pool[];
  35. SegTreeNode *top = pool;
  36.  
  37. SegTreeNode* newnode() {
  38. return top++;
  39. }
  40.  
  41. typedef class SegTree {
  42. public:
  43. SegTreeNode** rts;
  44.  
  45. SegTree():rts(NULL) { }
  46. SegTree(int n) {
  47. rts = new SegTreeNode*[(n + )];
  48. build(rts[], , n);
  49. }
  50.  
  51. void build(SegTreeNode*& node, int l, int r) {
  52. node = newnode();
  53. if(l == r) return;
  54. int mid = (l + r) >> ;
  55. build(node->l, l, mid);
  56. build(node->r, mid + , r);
  57. }
  58.  
  59. void update(SegTreeNode*& newv, SegTreeNode*& oldv, int l, int r, int idx, int val) {
  60. newv = newnode();
  61. *newv = *oldv;
  62. if(l == r) {
  63. newv->val = val;
  64. return;
  65. }
  66. int mid = (l + r) >> ;
  67. if(idx <= mid) update(newv->l, oldv->l, l, mid, idx, val);
  68. else update(newv->r, oldv->r, mid + , r, idx, val);
  69. }
  70.  
  71. int query(SegTreeNode*& node, int l, int r, int idx) {
  72. if(l == r) return node->val;
  73. int mid = (l + r) >> ;
  74. if(idx <= mid) return query(node->l, l, mid, idx);
  75. return query(node->r, mid + , r, idx);
  76. }
  77.  
  78. SegTreeNode*& operator [] (int pos) {
  79. return rts[pos];
  80. }
  81. }SegTree;
  82.  
  83. int n;
  84. int length[];
  85. SegTree st;
  86. char s[];
  87.  
  88. inline void solve() {
  89. scanf("%d", &n);
  90. st = SegTree(n);
  91. length[] = ;
  92. for(int opt = , v = , x; opt <= n; opt++) {
  93. scanf("%s%d", s, &x);
  94. switch(s[]) {
  95. case 'A':
  96. length[v] = length[v - ] + ;
  97. st.update(st[v], st[v - ], , n, length[v], x), v++;
  98. break;
  99. case 'Q':
  100. printf("%d\n", st.query(st[v - ], , n, x));
  101. break;
  102. case 'U':
  103. length[v] = length[v - x - ];
  104. st[v] = st[v - x - ], v++;
  105. break;
  106. }
  107. }
  108. }
  109.  
  110. int main() {
  111. solve();
  112. return ;
  113. }

OpenJudge cdqz/Data Structure Challenge 2 (Problem 5822) - 可持久化线段树的更多相关文章

  1. [Codeforces 464E] The Classic Problem(可持久化线段树)

    [Codeforces 464E] The Classic Problem(可持久化线段树) 题面 给出一个带权无向图,每条边的边权是\(2^{x_i}(x_i<10^5)\),求s到t的最短路 ...

  2. [BZOJ 3218] A + B Problem 【可持久化线段树 + 网络流】

    题目连接:BZOJ - 3218 题目分析 题目要求将 n 个点染成黑色或白色,那么我们可以转化为一个最小割模型. 我们规定一个点 i 最后属于 S 集表示染成黑色,属于 T 集表示染成白色,那么对于 ...

  3. luogu P4137 Rmq Problem / mex(可持久化线段树)

    一开始想的是莫队,然后维护几个bitset,然后瞎搞.脑子里想了想实现,发现并不好写. 还是主席树好写.我们维护一个权值的线段树,记录每一个权值的最后一次出现的位置下标.我们查询的时候要在前\(r\) ...

  4. 【Data Structure】-NO.117.DS.1 -【Tree-23树】

    [Data Structure]-NO.117.DS.1 -[Tree-23树] Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total ...

  5. 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex

    题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...

  6. UOJ#77. A+B Problem [可持久化线段树优化建边 最小割]

    UOJ#77. A+B Problem 题意:自己看 接触过线段树优化建图后思路不难想,细节要处理好 乱建图无果后想到最小割 白色和黑色只能选一个,割掉一个就行了 之前选白色必须额外割掉一个p[i], ...

  7. 【BZOJ-3218】a+b Problem 最小割 + 可持久化线段树

    3218: a + b Problem Time Limit: 20 Sec  Memory Limit: 40 MBSubmit: 1320  Solved: 498[Submit][Status] ...

  8. POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询)

    POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询) 题意分析 注意一下懒惰标记,数据部分和更新时的数字都要是long long ,别的没什么大 ...

  9. 【BZOJ 3218】 3218: a + b Problem(最小割+可持久化线段树)

    3218: a + b Problem Time Limit: 20 Sec  Memory Limit: 40 MBSubmit: 1440  Solved: 545 Description Inp ...

随机推荐

  1. Linux之HugePages快速配置

    关于Linux系统的HugePages与Oracle数据库优化,可以参考熊爷之前的文章,相关概念介绍的非常清晰: Linux大内存页Oracle数据库优化 本文旨在Linux系统上快速配置HugePa ...

  2. Linux 配置yum源.

    Linux 配置yum源. 环境:虚拟机中安装了RedHat ,在进行安装mariadb的时候,出现如下错误.是因为yum源的问题,需要进行配置yum源.本教程是配置本地yum源. [root@loc ...

  3. Could not locate executable null\bin\winutils.exe in the Hadoop binaries.

    很明显应该是HADOOP_HOME的问题.如果HADOOP_HOME为空,必然fullExeName为null\bin\winutils.exe.解决方法很简单,配置环境变量,不想重启电脑可以在程序里 ...

  4. PM2管理工具的使用

    linux上PM2可以管理服务程序,防止程序无故关闭,具有程序守护功能,自动重启服务器程序,监控程序等好处,很方便,具体自己去体会! 官网地址:  http://pm2.keymetrics.io/ ...

  5. kali漏洞扫描

    nmap (apt-get install nmap)          nmap从初级到高级 ------------------------------ Nessus (dpkg -i Nessu ...

  6. vs2015 C#打包程序为exe

    说明:将自己写的C#源代码打包后生成exe,直接安装在别人的电脑上运行,就像我们在网上下载别人的软件一样,很高大上,vs2015提供了打包和生成exe功能: 步骤一.打开vs2015(其他版本应该也是 ...

  7. Python 5 -- 模块

    模块 - 模块就是包含函数的文件,用于共享代码. 导入已有模块 # 导入整个模块 import random # 导入整个模块 print(random.randint(0,255)) #调用模块中的 ...

  8. 20155228 实验三 敏捷开发与XP实践

    20155228 实验三 敏捷开发与XP实践 实验内容 1. XP基础 2. XP核心实践 3. 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)>& ...

  9. JavaScript 函数声明与函数表达式的区别 函数声明提升(function declaration hoisting)

    解析器在向执行环境中加载数据时,对函数声明和函数表达式并非一视同仁.解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问).至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真的被 ...

  10. 怎么查 ODBC Driver for SQL Server

    1)进入服务器,找到SQL Server 2016 Configuration... ,点进去就好了 2)