#include #include #include #include #include #include #include #include #include #include #include #include #include #define rf freopen("in.in", "r", stdin) #define wf freopen("out.out", "w", stdout) #define rep(i, s, n) for(int i=int(s); i<=int(n); ++i) using namespace std; const int mx = 1e5 + 10, mod = 1e9+7; int a[2*mx]; int n, q; struct node { bool bits[32]; int mini; } segTree[8*mx]; void build(int x, int y, int r) { if(x == y) { int num = a[x], idx = 0; while(num) { segTree[r].bits[idx] = (num&1); num >>= 1; idx++; } segTree[r].mini = a[x]; return; } int mid = (x+y) >> 1; build(x, mid, 2*r); build(mid+1, y, 2*r+1); rep(i, 0, 31) segTree[r].bits[i] = (segTree[2*r].bits[i] | segTree[2*r+1].bits[i]); segTree[r].mini = min(segTree[2*r].mini, segTree[2*r+1].mini); } void update(int x, int y, int r, int qs, int qe, int val) { if(y < qs or qe < x or y < x) return; int check = 0; rep(i, 0, 31) { if(segTree[r].bits[i] and !((val >> i)&1)) { check = 1; break; } } if(!check) return; if(x == y) { rep(i, 0, 31) segTree[r].bits[i] &= ((val >> i)&1); segTree[r].mini &= val; return; } int mid = (x+y)>>1; update(x, mid, 2*r, qs, qe, val); update(mid+1, y, 2*r+1, qs, qe, val); rep(i, 0, 31) segTree[r].bits[i] = (segTree[2*r].bits[i] | segTree[2*r+1].bits[i]); segTree[r].mini = min(segTree[2*r].mini, segTree[2*r+1].mini); } int query(int x, int y, int r, int qs, int qe) { if(y> 1; return min( query(x, mid, 2*r, qs, qe), query(mid+1, y, 2*r+1, qs, qe) ); } int main() { //rf; wf; ios::sync_with_stdio(0); scanf("%d %d", &n, &q); rep(i, 1, n) scanf("%d", &a[i]); build(1, n, 1); while(q--) { int option, l, r; scanf("%d %d %d", &option, &l, &r); if(!option) { printf("%d\n", query(1, n, 1, l, r)); } else { int val; scanf("%d", &val); update(1, n, 1, l, r, val); } } return 0; }