#include <fstream>
#include <climits>
#define NMAX 100005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int m,n,a[NMAX],arb[2*NMAX];
void citire()
{fin>>n>>m;
int i;
for(i = 1; i <= n; ++i)
fin>>a[i];
}
int min1(int x, int y)
{
if(x < y)
return x;
return y;
}
void build(int nod, int st, int dr)
{
if(st == dr)
{
arb[nod] = a[st];
return;
}
int mijloc = (st + dr) / 2, fiu = 2 * nod;
build(fiu, st,m);
build(fiu + 1, m + 1, dr);
arb[nod] = min(arb[fiu], arb[fiu+1]);
}
int query(int nod, int st, int dr, int x, int y)
{
if(st > y || dr < x)
return INT_MAX;
if(x <= st && dr <= y)
return arb[nod];
int m = (st + dr)/2, fiu = 2 * nod;
return min1(query(fiu, st, m, x, y), query(fiu + 1, m + 1, dr, x, y));
}
void update(int nod, int st, int dr, int x, int y)
{
if(st > x || dr < x)
return;
if(st == dr)
{
arb[nod] = y;
return;
}
int m = (st + dr)/2, fiu = 2*nod;
update(fiu,st,m,x,y);
update(fiu + 1, m + 1, dr, x, y);
arb[nod] = min1(arb[fiu], arb[fiu+1]);
}
int main()
{ citire();
build(1,1,n);
while(m--)
{
int op,x,y;
fin>>op>>x>>y;
if(op == 1)
fout<<query(1,1,n,x,y)<<'\n';
else
update(1,1,n,x,y);
}
fin.close();
fout.close();
return 0;
}