Problem:
Problem I : RMQ

n 個の数字a0 ,a1 , ... ,an-1 とq が与えられる。

q 個のクエリーに対して適切な処理を行なって欲しい。

クエリーは以下の3種類の操作が存在する。

値のシフトを行う

l とr のペアが与えられる。(l < r )
al から ar までの値を Circular Shiftさせる。

0 1 2 3 4 5 6 7 8 9

に対してl=2,r=5というクエリーが与えられたとする。

シフトを行った数字列は

0 1 5 2 3 4 6 7 8 9

となる。

最小値を求める

l とr のペアが与えられる。(l ≤ r )

al から arまでの値の中で最小の値を求める。

値の更新

pos と val のペアが与えられる。
apos の値を val に更新する。

Input

入力は以下のフォーマットで与えられる。

n q
a0
a1
.
.
.
an-1
x1 y1 z1
x2 y2 z2
.
.
.
xq yq zq

xi = 0 なら、シフトのクエリーを表す。このとき、l = yi , r = zi とする。

xi = 1 なら、最小値を求めるクエリーを表す。このとき、l = yi , r = zi とする。

xi = 2 なら、値を更新するクエリーを表す。このとき、pos = yi , val = zi とする。

入力は以下の制約を満たす

1 ≤ n , q ≤ 200,000

0 ≤ ai ≤ 10,000,000

値を更新するクエリーについて、0 ≤ val ≤ 10,000,000

Output

クエリーとしてxi = 1 が与えられたときに、答えの値を１行に出力せよ。

Sample Input 1

10 3
0
1
2
3
4
5
6
7
8
9
1 5 7
0 2 5
1 5 7

Sample Output 1

5
4

Sample Input 2

10 10
289383
930886
692777
636915
747793
238335
885386
760492
516649
641421
2 7 368690
1 3 6
0 2 6
1 1 8
0 2 9
2 2 665123
1 5 9
0 2 8
2 7 961393
1 1 2

Sample Output 2

238335
238335
238335
368690

Solution in C (judge verdict: Time Limit Exceeded)

#include <stdio.h>
#include <stdlib.h>

	int number,queue;

int int_sort( const void * a , const void * b ) {
  if( *( int * )a < *( int * )b ) {
    return -1;
  }
  else
  if( *( int * )a == *( int * )b ) {
    return 0;
  }
  return 1;
}

int query(int numberset[],int queueset[]);

int main(){
	int i=0,j=0;
	int *numberset,*queueset;
	scanf("%d %d",&number,&queue);
	numberset=(int*)malloc(sizeof(int)*number);
	queueset=(int*)malloc(sizeof(int)*queue*3);
	for(i=0;i<number;i++){
	scanf("%d",&numberset[i]);
	}
	for(j=0;j<queue*3;j+=3){
	scanf("%d %d %d",&queueset[j],&queueset[j+1],&queueset[j+2]);
	}
	query(numberset,queueset);
	free(numberset);
	free(queueset);
	/*int numberl[5]={50,40,30,20,60};
	int queuel[3]={1,0,4};
	number=5; queue=1;
	query(numberl,queuel);
	*/
	return 0;
}

int query(int numberset[],int queueset[]){
	int i,j;
	int temp;
	int min_number;
	int queueparam,num1,num2;
	int *data;
	//printf("----------\n");
	for(i=0;i<queue;i++){
		temp=0; min_number=0;
		queueparam=queueset[i*3];
		num1=queueset[1+i*3]; num2=queueset[2+i*3];
		switch(queueparam){
			
		case 0: //shift
			temp=numberset[num2];
		for(j=num2;j>num1;j--){
			numberset[j]=numberset[j-1];
		}
			numberset[num1]=temp;
		/*for(j=0;j<number;j++){
			printf("%d\n",numberset[j]);
		}*/
		//printf("----------\n");
		break;
		
		case 1: //min
		data=(int*)malloc(sizeof(int)*(num2-num1+1));
		for(j=num1;j<num2+1;j++){
			data[j-num1]=numberset[j];
		}
		qsort(( void * )data , (num2-num1+1) , sizeof(int) , int_sort );
		printf("%d\n",data[0]);
		free(data);
		//printf("----------\n");
		break;
		
		case 2: //change
		numberset[num1]=num2;
		/*for(j=0;j<number;j++){
			printf("%d\n",numberset[j]);
		}*/
		//printf("----------\n");
		break;
		}
	}
	return 0;
}