uva_12299 RMQ with Shifts

 RMQ with Shifts 

In the traditional RMQ (Range Minimum Query) problem, we have a static array A. Then for eachquery (L, R) (L$ \le$R), we report the minimum value among A[L], A[L + 1], ..., A[R]. Note that theindices start from 1, i.e. the left-most element is A[1].

In this problem, the array A is no longer static: we need to support another operation

shift( i 1, i 2, i 3,..., i k)( i 1 < i 2 < ... < i k, k > 1)

we do a left ``circular shift" of A[i1], A[i2], ..., A[ik].

For example, if A={6, 2, 4, 8, 5, 1, 4}, then shift(2, 4, 5, 7) yields {6, 8, 4, 5, 4, 1, 2}. After that,shift(1, 2) yields 8, 6, 4, 5, 4, 1, 2.

Input 

There will be only one test case, beginning with two integers n, q ( 1$ \le$n$ \le$100, 000, 1$ \le$q$ \le$250, 000),the number of integers in array A, and the number of operations. The next line contains n positiveintegers not greater than 100,000, the initial elements in array A. Each of the next q lines contains anoperation. Each operation is formatted as a string having no more than 30 characters, with no spacecharacters inside. All operations are guaranteed to be valid.


Warning: The dataset is large, better to use faster I/O methods.

Output 

For each query, print the minimum value (rather than index) in the requested range.

Sample Input 

7 5
6 2 4 8 5 1 4
query(3,7)
shift(2,4,5,7)
query(1,4)
shift(1,2)
query(2,2)

Sample Output 

1
4
6
 
  
 
  
#include
#include
#define L(i) i<<1
#define R(i) i<<1|1
#define N 100011
/*
线段树,注意这里是离散的点更新,这些点是有序的,update(l,r,id)中
l、r表示更新的点的下表,若左右孩子都更新时for()寻找断点
状态不佳,l、r的含义糊涂了好久
*/
struct node{
    int l,r,val;
    int mid(){return (l+r)/2;}
}st[N<<2];
int min(int a,int b){
    return a=r)
        return query(l,r,L(id));
    else if(mid=com[r])
            update(l,r,L(id));
        else if(mid


你可能感兴趣的:(SegmentTree)