struct segtree {
    //static int n;
    vl t,lazy;

    void init(/*vi &arr*/) {
        //n = arr.size();
        t = vl(n*4, INT_MAX);
        lazy = vl(n*4);
    }
    void push(int v) {
        if (!lazy[v]) return;
        t[2*v] = lazy[v];
        lazy[2*v] = lazy[v];
        t[2*v+1] = lazy[v];
        lazy[2*v+1] = lazy[v];
        lazy[v] = 0;
    }
    void upd(int l,int r,ll val,int tl=0,int tr=n,int v=1) {
        if (l>r) return;
        if (tl==l && tr==r)
            t[v] = val, lazy[v] = t[v];
        else {
            push(v);
            int tm = (tl+tr)/2;
            upd(l,min(tm,r),val,tl,tm,v*2);
            upd(max(tm+1,l),r,val,tm+1,tr,v*2+1);
            t[v] = min(t[2*v],t[2*v+1]);
        }
    }
    int get(int ind,int tl=0,int tr=n,int v=1) {
        if (tl==ind&&tr==ind)
            return t[v];
        int tm = (tl+tr)/2;
        if (ind <= tm) return get(ind,tl,tm,v*2);
        else return get(ind,tm+1,tr,v*2+1);
    }
};