G. The Declaration of Independence
time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

In 1776, a Committee of Five was chosen to draft the Declaration of Independence of the USA, among them John Adams, Thomas Jefferson and Benjamin Franklin. From June 11 to July 5 they worked tirelessly to write such important document.

It wasn't written correctly in the first attempt, and many many changes had to be made. Since in that time there weren't such great and time-saving utilities like git and version control, they had a very simple but time consuming way to keep old versions of the document.

Suppose Thomas Jefferson wanted to add a line to a version i of the document. Instead of changing the actual document in version i, he would use a letter copying press, a machine just invented by James Watt just around that time, to copy the version i to a new sheet of paper, and then would modify this new sheet of paper. This paper would then be stored so it could be copied later. As each modification creates a new version of the document, the kth modification will create the version k of the document. You can assume the version 0 of the document is an empty piece of paper.

As everything was written in ink and the committee doesn't like to contradict itself, each modification could only add some lines to the end of the document, or erase some lines from the beginning of the document.

Your task is to simulate the making of the Declaration of Independence. Each sentence is represented as an integer number. You need to process the following queries:

  • E v x — Copy the document with version v, then add sentence x to the end of the copied document
  • D v — Copy the document with version v, then remove the first sentence of the copied document

Queries are numbered from one. The document with version 0 is empty.

Input

In the first line an integer Q, the number of queries. Each of the next Q lines has a query, in the format given in the statement.

Limits

  • 1 ≤ Q ≤ 105
  • In the ith query it is guaranteed that 0 ≤ v < i
  • For each query of type E, x will fit in a 32-bit signed integer
  • For each query of type D, it is guaranteed the document will not be empty during the removal of the first sentence
Output

For each query of type D, print the sentence removed.

Example
input
8
E 0 10
E 0 -10
D 2
D 1
E 2 5
D 5
D 6
D 2
output
-10
10
-10
5
-10

题意:q个操作,你需要在i是一个队列;

   E v x 表示在第v个队列插入x,形成第i个队列;

   D v 表示去掉v的对头,形成第i个队列;

思路:主席树,利用线段树第i个点,存储队列第(i-对头的位置)个元素的大小;

   利用L,R数组表示这个队列的左端在L[i],右端在R[i]的位置;

  

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<queue>
#include<algorithm>
#include<stack>
#include<cstring>
#include<vector>
#include<list>
#include<set>
#include<map>
using namespace std;
#define ll long long
#define pi (4*atan(1.0))
#define eps 1e-14
#define bug(x) cout<<"bug"<<x<<endl;
const int N=1e5+,M=1e6+,inf=1e9+;
const ll INF=1e18+,mod=1e9+;
struct SGT
{
int ls[N*],rs[N*],rt[N*],L[N*],R[N*],num[N*];
int tot;
void init()
{
tot=;
memset(num,,sizeof(num));
memset(ls,,sizeof(ls));
memset(rs,,sizeof(rs));
memset(rt,,sizeof(rt));
memset(L,,sizeof(L));
memset(R,,sizeof(R));
}
void build(int l,int r,int &pos)
{
pos=++tot;
if(l==r)return;
int mid=(l+r)>>;
build(l,mid,ls[pos]);
build(mid+,r,rs[pos]);
}
void update(int rt,int p,int c,int l,int r,int &pos)
{
pos=++tot;
ls[pos]=ls[rt];
rs[pos]=rs[rt];
if(l==r)
{
num[pos]=c;
return;
}
int mid=(l+r)>>;
if(p<=mid)update(ls[rt],p,c,l,mid,ls[pos]);
else update(rs[rt],p,c,mid+,r,rs[pos]);
}
int query(int p,int l,int r,int pos)
{
if(l==r) return num[pos];
int mid=(l+r)>>;
if(p<=mid)return query(p,l,mid,ls[pos]);
else return query(p,mid+,r,rs[pos]);
}
}tree;
char a[];
int main()
{ int q;
scanf("%d",&q);
//tree.init();
tree.build(,q,tree.rt[]);
tree.L[]=;
tree.R[]=;
for(int i=;i<=q;i++)
{
scanf("%s",a);
if(a[]=='E')
{
int v,x;
scanf("%d%d",&v,&x);
tree.L[i]=tree.L[v];
tree.R[i]=tree.R[v];
tree.update(tree.rt[v],++tree.R[i],x,,q,tree.rt[i]=tree.rt[v]);
}
else
{
int v;
scanf("%d",&v);
tree.L[i]=tree.L[v];
tree.R[i]=tree.R[v];
//cout<<tree.L[v]<<" "<<tree.R[v]<<endl;
printf("%d\n",tree.query(tree.L[i]++,,q,tree.rt[i]=tree.rt[v]));
}
}
return ;
}
/* 8
E 0 10
E 0 -10
D 2
D 1
E 2 5
D 5
D 6
D 2 */

GYM 101064 2016 USP Try-outs G. The Declaration of Independence 主席树的更多相关文章

  1. gym 101064 G.The Declaration of Independence (主席树)

    题目链接: 题意: n个操作,有两种操作: E p  c    在序号为p的队列尾部插入c得到新的队列,序号为i D p   查询并删除序号为p的队列顶部的元素,得到序号为i的新队列 思路: 需要查询 ...

  2. Gym 101064 D Black Hills golden jewels (二分)

    题目链接:http://codeforces.com/gym/101064/problem/D 问你两个数组合相加的第k大数是多少. 先sort数组,二分答案,然后判断其正确性(判断过程是枚举每个数然 ...

  3. 2016年省赛 G Triple Nim

    2016年省赛 G Triple Nimnim游戏,要求开始局面为先手必败,也就是异或和为0.如果n为奇数,二进制下最后一位只有两种可能1,1,1和1,0,0,显然异或和为1,所以方案数为0如果n为偶 ...

  4. 数据结构(主席树):HZOI 2016 采花

    [题目描述] 给定一个长度为n,包含c种颜色的序列,有m个询问,每次给出两个数l,r,表示询问区间[l,r]中有多少种颜色的出现次数不少于2次. 本题强制在线,对输入的l,r进行了加密,解密方法为: ...

  5. codeforces gym #101161E - ACM Tax(lca+主席树)

    题目链接: http://codeforces.com/gym/101161/attachments 题意: 给出节点数为$n$的树 有$q$次询问,输出$a$节点到$b$节点路程中,经过的边的中位数 ...

  6. bzoj4408 [Fjoi 2016]神秘数 & bzoj4299 Codechef FRBSUM 主席树+二分+贪心

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4299 https://lydsy.com/JudgeOnline/problem.php?id ...

  7. 牛客多校第三场 G Removing Stones(分治+线段树)

    牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...

  8. codeforces Gym 100735 D、E、G、H、I

    http://codeforces.com/gym/100735 D题 直接暴力枚举 感觉这道题数据有点问题 为什么要先排下序才能过?不懂.. #include <stdio.h> #in ...

  9. 2016年省赛G题, Parenthesis

    Problem G: Parenthesis Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 398  Solved: 75[Submit][Status ...

随机推荐

  1. win10 +python3.6环境下安装opencv以及pycharm导入cv2有问题的解决办法

    一.安装opencv 借鉴的这篇博客已经写得很清楚了--------https://blog.csdn.net/u011321546/article/details/79499598       ,这 ...

  2. flask框架----数据库连接池

    数据库连接池 flask中是没有ORM的,如果在flask里面连接数据库有两种方式 一:pymysql 二:SQLAlchemy 是python 操作数据库的一个库.能够进行 orm 映射官方文档 s ...

  3. 使用准现网的数据,使用本地的样式脚本,本地调试准现网页面(PC适用)

    原理: 本地逻辑,重新渲染 步骤: 1.安装插件:Tampermonkey 度盘:https://pan.baidu.com/s/1bpBVVT9 2.设置: 点击插件-->仪表盘 添加脚本 将 ...

  4. The logback manual #03# Configuration

    索引 Configuration in logback Automatically configuring logback Automatic configuration with logback-t ...

  5. fjwc2019 D4T1 循环流

    #187. 「2019冬令营提高组」循环流 假的网络流,其实是O(1)算法 手画n个图后,你会发现只要分成几种情况讨论讨论就得了. 当$a==1$时显然不存在. 当$a!=1$时 如果$n==2$,显 ...

  6. udp编程 实例

    server端 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <er ...

  7. keepalived的原理以及配置使用详解

    一.vrrp协议简介 VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议. VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路 ...

  8. sftp服务器的安装与远程

    本文所描述环境只在window系统下 一.搭建sftp服务器 1.首先需要下载一个软件freeSSHd,下载地址http://www.freesshd.com/?ctt=download,下载第一个f ...

  9. topcoder srm 415 div1

    problem1 link 每次贪心地从crans由大到小地找到一个能搬得动地尽量大地box即可. problem2 link 首先,$hava$可以全部换成钱,然后就是找到一个最小的钱减去自己已有的 ...

  10. Oracle使用——Oracle表空间处理

    创建表空间 查看表空间信息(名称.大小)  select t1.name tablespace_name ,t2.name file_local ,t2.bytes / (1024 * 1024) f ...