#include<bits/stdc++.h>
using namespace std;
using ll=long long;
#define fr(i,n) for(int i=0;i<(n);++i)
#define Fr(i,n) for(int i=1;i<=(n);++i)
#define ifr(i,n) for(int i=(n)-1;i>=0;--i)
#define iFr(i,n) for(int i=(n);i>0;--i)

template<class T, class E=T> struct LST{
    using F=function<T(T, T)>;
    using G=function<T(T, E)>;
    using H=function<E(E, E)>;
    using P=function<E(E, int)>;
    int n; F f; G g; H h; T et; E ee; P p;
    int cur;
    vector<T> data;
    vector<E> lazy;
    vector<int> idx,len;

    LST(int n_,F f,G g,H h,T et,E ee,P p=[](E a, int b){return a;}):
            n(1),f(f),g(g),h(h),et(et),ee(ee),p(p){
        while(n<n_) n<<=1;
        data.resize(n<<1, et);
        lazy.resize(n<<1, ee);
        idx.resize(128, -1);
        len.resize(n<<1, 1);
        for(int i=n-1;i;--i) len[i]=len[i<<1]<<1;
    }

    void build(vector<T>&v){
        for(int i=0;i<v.size();++i) data[i^n]=v[i];
        for(int i=n-1;i;--i) data[i]=f(data[i<<1],data[(i<<1)^1]);
    }

    inline void getidx(int a,int b){
        cur=0;
        if(a==n&&b==(n<<1)) return;
        while(1^a&1) a>>=1;
        while(1^b&1) b>>=1;
        a>>=1;
        b>>=1;
        while(a>1||b>1){
            if(a>=b){
                idx[cur++]=a;
                a>>=1;
            }
            else{
                idx[cur++]=b;
                b>>=1;
            }
        }
        idx[cur++]=1;
    }

    inline void eval(){
        int i;
        for(int k=cur-1;k>=0;--k){
            i=idx[k];
            if(lazy[i]==ee) continue;
            lazy[i<<1] = h(lazy[i<<1], lazy[i]);
            data[i<<1] = g(data[i<<1], p(lazy[i<<1], len[i<<1]));
            lazy[(i<<1)^1] = h(lazy[(i<<1)^1], lazy[i]);
            data[(i<<1)^1] = g(data[(i<<1)^1], p(lazy[(i<<1)^1], len[(i<<1)^1]));
            lazy[i] = ee;
        }
    }

    void ud(int a,int b,const E x){
        a+=n;b+=n;
        getidx(a, b);
        eval();
        for(;a<b;a>>=1,b>>=1){
            if(a&1){
                lazy[a]=h(lazy[a],x);
                data[a]=g(data[a],p(lazy[a],len[a]));
                ++a;
            }
            if(b&1){
                --b;
                lazy[b]=h(lazy[b],x);
                data[b]=g(data[b],p(lazy[b],len[b]));
            }
        }
        int i;
        for(int k=0;k<cur;++k){
            i=idx[k];
            data[i]=f(data[i<<1],data[(i<<1)^1]);
        }
    }

    T gt(int a, int b){
        a+=n;b+=n;
        getidx(a,b);
        eval();
        T vl=et,vr=et;
        for(;a<b;a>>=1,b>>=1){
            if(a&1) vl=f(vl,data[a++]);
            if(b&1) vr=f(data[--b],vr);
        }
        return f(vl,vr);
    }
};

template<class T> struct SegMIN{
    int n;
    T e;
    vector<T> dat;

    SegMIN(vector<T> v,T e_){
        int n_=v.size();
        n=1;e=e_;
        while(n<n_) n<<=1;
        dat.resize((n<<1),e);
        for(int i=0;i<n_;++i) dat[i+n]=v[i];
        for(int i=n-1;i>0;--i) dat[i]=min(dat[(i<<1)],dat[(i<<1)+1]);
    }

    void ud(int k,T c){
        k+=n;
        dat[k]=c;
        while(k>=0){
            dat[k>>1]=min(dat[k],dat[k^1]);
            k>>=1;
        }
    }

    T gt(int l,int r){
        l+=n;r+=n;
        T s=e;
        while(l<r){
            if(r&1){
                --r;
                s=min(s,dat[r]);
            }
            if(l&1){
                s=min(s,dat[l]);
                ++l;
            }
            l>>=1,r>>=1;
        }
        return s;
    }

    T operator[](int i){return dat[i+n];}
};

int main(){
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    istream& in(cin);
    ostream& out(cout);
    int n, q;
    scanf("%d%d", &n, &q);
    auto f = [](int a, int b){return min(a, b);};
    auto g = [](int a, int b){return b;};
    LST<int, int> lst(n, f, g, g, INT_MAX, INT_MAX);
    while(q--){
        int c, s, t, x;
        scanf("%d%d%d", &c, &s, &t);
        if(c == 0){
            scanf("%d", &x);
            lst.ud(s, t+1, x);
        }
        else printf("%d\n",lst.gt(s, t+1));
    }
}


Measured memory_bytes: 6016