Problem: Write a program which manipulates a sequence A = {a0, a1, . . . , an−1} with the following operations:

* update(s, t, x): change as, as+1, ..., at to x.
* find(s, t): report the minimum element in as, as+1, ..., at.



Note that the initial values of ai (i = 0, 1, . . . , n−1) are 231-1.

Constraints

* 1 ≤ n ≤ 100000
* 1 ≤ q ≤ 100000
* 0 ≤ s ≤ t < n
* 0 ≤ x < 231−1

Input


n q
query1
query2
:
queryq


In the first line, n (the number of elements in A) and q (the number of queries) are given. Then, ith query queryi is given in the following format:


0 s t x


or


1 s t


The first digit represents the type of the query. '0' denotes update(s, t, x) and '1' denotes find(s, t).

Output

For each find operation, print the minimum value.

Examples

Input

3 5
0 0 1 1
0 1 2 3
0 2 2 2
1 0 2
1 1 2


Output

1
2


Input

1 3
1 0 0
0 0 0 5
1 0 0


Output

2147483647
5

Solution (in CPP):

Solution:
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
#include<stdio.h>
#include<fstream>
#include<stdlib.h>
#include<math.h> 
#include<queue>
#include<string.h>
#include<stack>


using namespace std;

#define INF 2147483647


int n=1;
int A[300000];
bool flag[300000];
int lazy[300000];

void init(int size){

	while(n<size){
		n*=2;
	}
	for(int i=0;i<2*n-1;i++){
		A[i]=INF;
		flag[i]=false;
	}
}

void eval(int k,int l,int r){
	if(flag[k]){
		A[k]=lazy[k];
		if(l+1<r){
			lazy[2*k+1]=lazy[2*k+2]=lazy[k];
			flag[2*k+1]=flag[2*k+2]=true;
		}
		flag[k]=false;
	}
}


void update(int x,int y,int a,int k=0,int l=0,int r=n){
	eval(k,l,r);
	if(r<=x||y<=l){
		return;
	}
	if(x<=l&&r<=y){
		flag[k]=true;
		lazy[k]=a;
		eval(k,l,r);
	}
	else{
		update(x,y,a,2*k+1,l,(l+r)/2);
		update(x,y,a,2*k+2,(l+r)/2,r);
        A[k]=min(A[2*k+1],A[2*k+2]);
	}
}


int query2(int x,int y,int k=0,int l=0,int r=n){
	eval(k,l,r);
	if(r<=x||y<=l){
		return INF;
	}
    if(x<=l&&r<=y){
    	return A[k];
    }
    int vl=query2(x,y,2*k+1,l,(l+r)/2);
    int vr=query2(x,y,2*k+2,(l+r)/2,r);
    return min(vl,vr);
}

int main(){
	int k;
	int q;
	cin>>k>>q;
	init(k);
	int qu;
	int x,y,s,t;
	for(int i=0;i<q;i++){
		cin>>qu;
		if(qu==0){
			cin>>s>>t>>x;
			update(s,t+1,x);
		}
		else if(qu==1){
			cin>>x>>y;
			cout<<query2(x,y+1)<<endl;
		}
	}
	return 0;
}