#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#include <set>
#include <cmath>
#include <tuple>
#include <cstring>
#include <map>
#include <iomanip>
#include <ctime>
#include <complex>
#include <cassert>
#include <climits>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define _ << " " <<
#define all(X) (X).begin(), (X).end()
#define len(X) (X).size()
#define Pii pair<int, int>
#define Pll pair<ll, ll>
#define Tiii tuple<int, int, int>
#define Tlll tuple<ll, ll, ll>

class SegTree_Delay {
public:
    int f;
    int INIT = INT_MAX;
    vector<int> dat, lazy;

    SegTree_Delay(int n) {
        f = 1;
        while (f < n) f *= 2;
        dat.assign(2 * f, INIT);
        lazy.assign(2 * f, INIT);
    }

    void eval(int k) {
        if (lazy[k] == INIT) return;
        if (k < f - 1) {
            lazy[2 * k + 1] = lazy[k];
            lazy[2 * k + 2] = lazy[k];
        }
        dat[k] = lazy[k];
        lazy[k] = INIT;
    }

    void update(int a, int b, int x, int k, int l, int r) {
        eval(k);
        if (a <= l && r <= b) {
            lazy[k] = x;
            eval(k);
        }
        else if (a < r && l < b) {
            update(a, b, x, k * 2 + 1, l, (l + r) / 2);
            update(a, b, x, k * 2 + 2, (l + r) / 2, r);
            dat[k] = min(dat[k * 2 + 1], dat[k * 2 + 2]);
        }
    }

    void update(int a, int b, int x) {
        update(a, b, x, 0, 0, f);
    }

    int query(int a, int b) {
        return query(a, b, 0, 0, f);
    }

    int query(int a, int b, int k, int l, int r) {
        eval(k);
        if (r <= a || b <= l) return INIT;
        if (a <= l && r <= b) return dat[k];
        else {
            int vl = query(a, b, k * 2 + 1, l, (l + r) / 2);
            int vr = query(a, b, k * 2 + 2, (l + r) / 2, r);
            return min(vl, vr);
        }
    }
};


int main() {
    int n, q;
    cin >> n >> q;
    SegTree_Delay st = SegTree_Delay(n);
    while (q--) {
        int m;
        cin >> m;
        if (m) {
            int s, t;  cin >> s >> t;
            cout << st.query(s, t + 1) << endl;
        }
        else {
            int s, t, x;
            cin >> s >> t >> x;
            st.update(s, t + 1, x);
        }
    }
}

