#include<bits/stdc++.h>

using namespace std;

struct node
{
	int num,l,r,ls,rs,lazy;
	node(int _l,int _r)
	{
		num=INT_MAX;
		l=_l;
		r=_r;
	}
};

vector<node> T;

int make(int l,int r)
{
	int id=T.size();
	T.push_back(node(l,r));
	T[id].ls=(l+1==r?-1:make(l,(l+r)/2));
	T[id].rs=(l+1==r?-1:make((l+r)/2,r));
	return id;
}

void update(int id,int l,int r,int t)
{
	//printf("|%d %d %d %d\n",id,l,r,t);
	if(l==r||T[id].l>=r||T[id].r<=l)
		return ;
	if(T[id].l>=l&&T[id].r<=r)
	{
		T[id].num=t;
		return ;
	}
	int mid=(T[id].l+T[id].r)>>1;
	if(T[id].num>=0)
		T[T[id].ls].num=T[T[id].rs].num=T[id].num;
	if(l<mid)
		update(T[id].ls,l,r,t);
	if(r>mid)
		update(T[id].rs,l,r,t);
	T[id].num=-1;
}

int getmin(int id,int l,int r)
{
	if(l==r||T[id].l>=r||T[id].r<=l)
		return INT_MAX; 
	if(T[id].num>=0)
		return T[id].num;
	int mid=(T[id].l+T[id].r)>>1,mi=INT_MAX;
	if(l<mid)
		mi=min(mi,getmin(T[id].ls,l,r));
	if(r>mid)
		mi=min(mi,getmin(T[id].rs,l,r));
	return mi;
}

int main()
{
	T.reserve(200100);
	int n,q;
	scanf("%d%d",&n,&q);
	make(0,n);
	for(int i=0;i<q;i++)
	{
		int com;
		scanf("%d",&com);
		if(com==0)
		{
			int s,t,x;
			scanf("%d%d%d",&s,&t,&x);
			update(0,s,t+1,x);
		//	for(int i=0;i<T.size();i++) printf("%d %d %d %d %d %d\n",i,T[i].num,T[i].l,T[i].r,T[i].ls,T[i].rs);
		}
		else
		{
			int s,t;
			scanf("%d%d",&s,&t);
			printf("%d\n",getmin(0,s,t+1));
		}
	}
}
/*
20 100
0 4 14 3
0 6 12 6
1 14 18
*/