Description

Your friend, Jackson is invited to a TV show called SuperMemo in which the participant is told to play a memorizing game. At first, the host tells the participant a sequence of numbers, {A1, A2, ... An}. Then the host performs a series of operations and queries on the sequence which consists:

  1. ADD x y D: Add D to each number in sub-sequence {Ax ... Ay}. For example, performing "ADD 2 4 1" on {1, 2, 3, 4, 5} results in {1, 3, 4, 5, 5}
  2. REVERSE x y: reverse the sub-sequence {Ax ... Ay}. For example, performing "REVERSE 2 4" on {1, 2, 3, 4, 5} results in {1, 4, 3, 2, 5}
  3. REVOLVE x y T: rotate sub-sequence {Ax ... Ay} T times. For example, performing "REVOLVE 2 4 2" on {1, 2, 3, 4, 5} results in {1, 3, 4, 2, 5}
  4. INSERT x P: insert P after Ax. For example, performing "INSERT 2 4" on {1, 2, 3, 4, 5} results in {1, 2, 4, 3, 4, 5}
  5. DELETE x: delete Ax. For example, performing "DELETE 2" on {1, 2, 3, 4, 5} results in {1, 3, 4, 5}
  6. MIN x y: query the participant what is the minimum number in sub-sequence {Ax ... Ay}. For example, the correct answer to "MIN 2 4" on {1, 2, 3, 4, 5} is 2

To make the show more interesting, the participant is granted a chance to turn to someone else that means when Jackson feels difficult in answering a query he may call you for help. You task is to watch the TV show and write a program giving the correct answer to each query in order to assist Jackson whenever he calls.

Input

The first line contains n (n ≤ 100000).

The following n lines describe the sequence.

Then follows M (M ≤ 100000), the numbers of operations and queries.

The following M lines describe the operations and queries.

Output

For each "MIN" query, output the correct answer.

Sample Input


ADD
MIN

Sample Output


Source

POJ Founder Monthly Contest – 2008.04.13, Yao Jinyu
一道splay模板题。要求你设计一个数据结构实现以下操作:
1)Add(l,r,d)向区间l~r中的元素加上一个数d;
2)Reverse(l,r)翻转区间l~r的元素;
3)Revolve(l,r,T)将区间l~r的后缀放到区间的前方,操作T次;
4)Insert(x,P)将元素P插入到元素x后方;
5)Delete(x)删除元素x;
6)Min(l,r)求区间l~r中的最小值;
因为操作和题目需要,我们建立三个虚根,0、root(在NewNode操作后,root初始值为1)和root的右孩子(即ch[root][1]),一个实根,root的右孩子的左孩子(即ch[ch[root][1]][0],Key_value的初始值)。
#include<cstdio>
#include<iostream>
#define INF 0x3f3f3f3f
#define Key_value ch[ch[root][1]][0]
using namespace std;
bool rev[];
int n,tot,root,a[],key[],add[],pre[],ch[][],size[],minn[];
inline void Update_Add(int r,int d)
{
if(!r)return;
add[r]+=d;
key[r]+=d;
minn[r]+=d;
}
inline void Update_Reve(int r)
{
if(!r)return;
rev[r]^=;
swap(ch[r][],ch[r][]);
}
inline void Push_Up(int k)
{
minn[k]=min(key[k],min(minn[ch[k][]],minn[ch[k][]]));
size[k]=size[ch[k][]]+size[ch[k][]]+;
}
inline void Push_Down(int r)
{
if(add[r]){
Update_Add(ch[r][],add[r]);
Update_Add(ch[r][],add[r]);
add[r]=;
}
if(rev[r]){
Update_Reve(ch[r][]);
Update_Reve(ch[r][]);
rev[r]=;
}
}
inline int Get_Kth(int r,int k)
{
Push_Down(r);
int t=size[ch[r][]]+;
if(t==k)return r;
if(t>k)return Get_Kth(ch[r][],k);
else return Get_Kth(ch[r][],k-t);
}
inline void NewNode(int &r,int father,int val)
{
r=++tot;
size[r]=;
pre[r]=father;
key[r]=minn[r]=val;
}
inline void Build(int &x,int father,int l,int r)
{
if(l>r)return;
int mid=(l+r)>>;
NewNode(x,father,a[mid]);
Build(ch[x][],x,l,mid-);
Build(ch[x][],x,mid+,r);
Push_Up(x);
}
inline void Init()
{
root=tot=;
minn[root]=INF;
ch[root][]=ch[root][]=pre[root]=add[root]=rev[root]=size[root]=;
NewNode(root,,INF);
NewNode(ch[root][],root,INF);
Build(Key_value,ch[root][],,n);
}
inline void Rotate(int x,int kind)
{
int y=pre[x];
Push_Down(y);
Push_Down(x);
ch[y][!kind]=ch[x][kind];
pre[ch[x][kind]]=y;
if(pre[y])ch[pre[y]][ch[pre[y]][]==y]=x;
pre[x]=pre[y];
ch[x][kind]=y;
pre[y]=x;
Push_Up(y);
}
inline void Splay(int r,int goal)
{
Push_Down(r);
while(pre[r]!=goal){
if(pre[pre[r]]==goal){
Push_Down(pre[r]);
Push_Down(r);
Rotate(r,ch[pre[r]][]==r);
}
else{
int y=pre[r];
int kind=ch[pre[y]][]==y;
Push_Down(pre[y]);
Push_Down(y);
Push_Down(r);
if(ch[y][kind]==r){
Rotate(r,!kind);
Rotate(r,kind);
}
else{
Rotate(y,kind);
Rotate(r,kind);
}
}
}
Push_Up(r);
if(!goal)root=r;
}
inline void Add(int l,int r,int d)
{
Splay(Get_Kth(root,l),);//调用Get_Kth()首参数要用root因为root可能变成区间内其他数;
Splay(Get_Kth(root,r+),root);
Update_Add(Key_value,d);
Push_Up(ch[root][]);
Push_Up(root);
}
inline int Min(int l,int r)
{
Splay(Get_Kth(root,l),);//ADD注释+1;
Splay(Get_Kth(root,r+),root);
return minn[Key_value];
}
inline void Del(int x)
{
Splay(Get_Kth(root,x),);
Splay(Get_Kth(root,x+),root);
pre[Key_value]=;
Key_value=;//直接清零即可;
Push_Up(ch[root][]);
Push_Up(root);
}
inline void Reve(int l,int r)
{
Splay(Get_Kth(root,l),);
Splay(Get_Kth(root,r+),root);
Update_Reve(Key_value);
Push_Up(ch[root][]);
Push_Up(root);
}
inline void Revo(int a,int b,int t)
{
int c=b-t;//将区间a~b分为两个区间a~b-c、b-c+1~b,将区间2旋转到区间1前;
Splay(Get_Kth(root,a),);
Splay(Get_Kth(root,c+),root);
int tmp=Key_value;
Key_value=;
Push_Up(ch[root][]);
Push_Up(root);
Splay(Get_Kth(root,b-c+a),);
Splay(Get_Kth(root,b-c+a+),root);
Key_value=tmp;
pre[Key_value]=ch[root][];
Push_Up(ch[root][]);
Push_Up(root);
}
inline void Ins(int x,int t)
{
Splay(Get_Kth(root,x+),);
Splay(Get_Kth(root,x+),root);
NewNode(Key_value,ch[root][],t);
Push_Up(ch[root][]);
Push_Up(root);
}
int main()
{
while(scanf("%d",&n)!=EOF){
for(int i=;i<=n;i++)scanf("%d",&a[i]);
Init();
int Case;
scanf("%d",&Case);
for(;Case;Case--){
char order[];
scanf("%s",order);
if(order[]=='A'){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
Add(x,y,z);
}
if(order[]=='M'){
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",Min(x,y));
}
if(order[]=='D'){
int x;
scanf("%d",&x);
Del(x);
}
if(order[]=='I'){
int x,t;
scanf("%d%d",&x,&t);
Ins(x,t);
}
if(order[]=='R'&&order[]=='E'){
int x,y;
scanf("%d%d",&x,&y);
Reve(x,y);
}
if(order[]=='R'&&order[]=='O'){
int x,y,T;
scanf("%d%d%d",&x,&y,&T);
Revo(x,y,(T%(y-x+)+y-x+)%(y-x+));
}
}
}
return ;
}

poj2580 Super Memmo的更多相关文章

  1. 子类继承父类时JVM报出Error:Implicit super constructor People() is undefined for default constructor. Must define an explicit constructor

    当子类继承父类的时候,若父类没有定义带参的构造方法,则子类可以继承父类的默认构造方法 当父类中定义了带参的构造方法,子类必须显式的调用父类的构造方法 若此时,子类还想调用父类的默认构造方法,必须在父类 ...

  2. [LeetCode] Super Ugly Number 超级丑陋数

    Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whose all ...

  3. Maven Super POM

    Maven super POM defines some properties. Three ways to find it ${M2_HOME}/lib/maven-model-builder-3. ...

  4. java基础 super 子类调用父类

    如果希望在子类中,去调用父类的构造方法,要求在子类的构造函数调用 example如下: package test; /* * 如果希望在子类中,去调用父类的构造方法,要求在子类的构造函数调用 * */ ...

  5. Python类中super()和__init__()的关系

    Python类中super()和__init__()的关系 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(sel ...

  6. java方法重载(overload)、重写(override);this、super关键简介

    一.方法重载: 条件:必须在一个类中,方法名称相同,参数列表不同(包括:数据类型.顺序.个数),典型案例构 造方重载.  注意:与返回值无关 二.方法重写: 条件: (1)继承某个类或实现某接口 (2 ...

  7. Java super关键字活用

    在实际开发中我们要自定义组件,就需要继承自某个组件类,如果我们自定义的这个组件类也需要像被继承的这个组件类一样,拥有丰富的构造方法. 关键字super的作用就更加显得尤为重要了,你可以在堆砌自己自定义 ...

  8. 深入super,看Python如何解决钻石继承难题 【转】

    原文地址 http://www.cnblogs.com/testview/p/4651198.html 1.   Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通 ...

  9. 关于[super dealloc]

    销毁一个对象时,需要重写系统的dealloc方法来释放当前类所拥有的对象,在dealloc方法中需要先释放当前类中所有的对象,然后再调用[super dealloc]释放父类中所拥有的对象.如先调用[ ...

随机推荐

  1. Atitit.木马病毒强制强行关闭360 360tray.exe的方法

    Atitit.木马病毒强制强行关闭360 360tray.exe的方法 1. taskkill /im 进程名称1 2. 用 wmic process where name="进程名称&qu ...

  2. JavaScript学习01 语言简介、基本使用和变量声明

    JavaScript语言简介.基本使用和变量声明 JavaScript是网景(Netscape)公司开发的一种基于客户端浏览器.面向对象.事件驱动式的网页脚本语言. JavaScript的前身叫Liv ...

  3. Android保持屏幕常亮的方法

    以前一直使用newWakeLock方法: this.powerManager = (PowerManager) this .getSystemService(Context.POWER_SERVICE ...

  4. 检测Xcode是否有问题

    之前的XCode中毒事件闹得沸沸扬扬,在网上找到检测XCode完整性的方式,有需要的小伙伴试试吧.忘记哪里转的了,愧对原创者 在终端输入 spctl 命令,并带上安装的 Xcode 的路径: spct ...

  5. OC点语法和变量作用域

    OC点语法和变量作用域 一.点语法 (一)认识点语法 声明一个Person类: #import <Foundation/Foundation.h> @interface Person : ...

  6. ARC机制

    ARC概念及原理 1.了解指针分类 (1)强指针:默认的情况下,所有的指针都是强指针,关键字strong (2)弱指针:_ _weak关键字修饰的指针 声明一个弱指针如下: _ _weak Perso ...

  7. E-R图的基础练习

    第1题: 设有商店和顾客两个实体,“商店”有属性:商店编号.商店名.地址.电话,“顾客”有属性:顾客编号.姓名.地址.年龄.性别.假设一个商店有多个顾客购物,一个顾客可以到多个商店购物,顾客每次去商店 ...

  8. 计算机网络和Internet之核心网络

    1.网状的路由器 路由器的链接组成了网络的核心. 任何一个路由器,或者某条线路挂掉,但是网络还是通的,这是internet的一个特性. data到底是怎么传输的? 1)circuit switchin ...

  9. 谈一次php无限极分类的案例

    作者:白狼 出处:http://www.manks.top/php_tree_deep.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追 ...

  10. 【转载】Linux NFS服务器的安装与配置

    一.NFS服务简介 NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布.功能是通过网络让不同的机器.不同的操 ...