#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;
	//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
qsort(( void * )numberset , number, sizeof( numberset[0] )
                                             , int_sort );
		printf("%d\n",min_number);
		//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;
}