/*
AizuOnline A1508
Title:RMQ
13/02/05 TE
*/
#include <stdio.h>
// Select Below
//#include <stdlib.h>
#include <string.h>
//#include <float.h>
//#include <math.h>
#include <limits.h>
#define min(x,y) (((x)<(y))?(x):(y))
//Global data section
int a[200000],n,q;
int min10[20000];
int x[200000];
int y[200000];
int z[200000];
//
void update_min10(int k10)
{
  int i,minval;
  minval=INT_MAX;
  for(i=k10*10;i<k10*10+10;i++)
    if(minval>a[i])
      minval=a[i];
  min10[k10]=minval;
}
void update_min10_all()
{
  int i;
  for(i=0;i<(n/10+1);i++)
    update_min10(i);
}

int min_val(int l,int r)
{
  int i,minv;
  minv=INT_MAX;
  for(i=l;i<=r;i++)
    if(minv   > a[i])
      minv=a[i];

  return(minv);
}
int ceil10(int n)
{
  if((n % 10)==0)
    return(n);
  else
    return((n / 10)*10+10);
}
int floor10(int n)
{
  if((n % 10)==0)
    return(n);
  else
    return((n / 10)*10);
}
int min_val_10(int l,int r)
{
  int lceil,rfloor,min_v,i,ret;
  lceil=ceil10(l);
  rfloor=floor10(r);
#ifdef DEBUG
  printf("l,r %d %d=> %d %d\n",l,r,lceil,rfloor);
#endif
  if(rfloor <= lceil) 
    return(min_val(l,r));
  else
    {
      min_v=min_val(l,lceil);
      for(i=lceil/10;i<rfloor/10;i++)
	if(min_v >min10[i])
	  min_v=min10[i];
      r=min_val(rfloor,r);
      if(min_v>ret)
	min_v = ret;
    }
  return(min_v);
}
void rotate(int l,int r)
{
  int i,wk;
  int lceil,rfloor;
  lceil=ceil10(l);
  rfloor=floor10(r);

  wk = a[r];
  memmove(a+l+1,a+l,(r-l)*sizeof(int));
  a[l]=wk;

  if(rfloor == lceil) 
    {
      update_min10(rfloor/10);
      update_min10(lceil/10);
    }
  else if  (rfloor < lceil)
	  {
	    ;
	  }
  else
    for(i=lceil;i<=rfloor;i+=10)
          update_min10(i/10);
}
void print()
{
  int i;

  for(i=0;i<n;i++)
    printf("%d:",a[i]);
  printf("\n");
  for(i=0;i<n/10;i++)  
      printf("%d:",min10[i]);
  printf("\n");
}
void update(int pos,int val)
{
  a[pos]=val;
  update_min10(pos/10);
#ifdef DEBUG
  print();
#endif
}
void iota(int cnt)
{
  int i;
  n=cnt;
  for(i=0;i<cnt;i++)
    a[i]=i;
}
void eval_query(int x,int y,int z)
{
  int ret;

  if(x == 0)
    {
      rotate(y,z);
#ifdef DEBUG
      print();
#endif
    }
  else if(x == 1)
    {
      ret=min_val_10(y,z);
      printf("%d\n",ret);
    }
  else if(x==2)
    update(y,z);
#ifdef DEBUG
  else if(x==3)
    iota(y);
#endif
}
main()
{
  int i;

  scanf("%d %d",&n,&q);
  for(i=0;i<n;i++)
    scanf("%d",&(a[i]));
  for(i=0;i<q;i++)
    scanf("%d %d %d",&(x[i]),&(y[i]),&(z[i]));

  update_min10_all();
#ifdef DEBUG
  print();
#endif
  for(i=0;i<q;i++)
    eval_query(x[i],y[i],z[i]);

return(0);
}