// AOJ DSL_2_F Range Query - RMQ and RUQ
// 2019.3.27 bal4u

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

#if 1
#define gc() getchar_unlocked()
#define pc(c) putchar_unlocked(c)
#else
#define gc() getchar()
#define pc(c) putchar(c)
#endif
int in()  // 非負整数の入力
{
	int n = 0, c = gc();
	do n = 10 * n + (c & 0xf), c = gc(); while (c >= '0');
	return n;
}

void out(int n)  // 非負整数の表示（出力）
{
	int i;
	char ob[20];

	if (!n) pc('0');
	else {
		i = 0; while (n) ob[i++] = n % 10 + '0', n /= 10;
		while (i--) pc(ob[i]);
	}
	pc('\n');
}

#define MAX (1<<17) //segment tree のサイズ。この実装では2べきにする必要がある
#define MIN(a, b)  ((a)<=(b)?(a):(b))
#define INF  0x7fffffff
int segVal[2*MAX], segLazy[2*MAX];

void lazy(int k)
{
	if (segLazy[k] != -1) {
		segVal[k] = segLazy[k];
		if (k < MAX - 1) {
			segLazy[(k << 1) + 1] = segLazy[k];
			segLazy[(k << 1) + 2] = segLazy[k];
		}
		segLazy[k] = -1;
	}
}

void update(int a, int b, int x, int k, int l, int r)
{
	if (r <= a || b <= l) {
		lazy(k);
		return;
	}
	if (a <= l && r <= b) {
		segLazy[k] = x;
		lazy(k);
		return;
	}
	lazy(k);
	update(a, b, x, (k << 1) + 1, l, (l + r) >> 1);
	update(a, b, x, (k << 1) + 2, (l + r) >> 1, r);
	segVal[k] = MIN(segVal[(k << 1) + 1], segVal[(k << 1) + 2]);
}

int getMin(int a, int b, int k, int l, int r)
{
	int le, ri;

	if (r <= a || b <= l) return INF;
	if (a <= l && r <= b) {
		lazy(k);
		return segVal[k];
	}
	lazy(k);
	le = getMin(a, b, (k<<1)+1, l, (l+r) >> 1);
	ri = getMin(a, b, (k<<1)+2, (l+r) >> 1, r);
	return MIN(le, ri);
}

int main()
{
	int N, Q, cmd, s, t, x;

	N = in(), Q = in();
	update(0, N, INF, 0, 0, N);
	while (Q--) {
		cmd = in(), s = in(), t = in() + 1;
		if (cmd == 0) {
			x = in();
			update(s, t, x, 0, 0, N);
		}
		else out(getMin(s, t, 0, 0, N));
	}
	return 0;
}
