rt,wa 10pts
#include <bits/stdc++.h>
using namespace std;
#define N 114514
#define M 1919810
#define fi first
#define se second
typedef long long ll;
typedef pair<int, int> pii;
template<typename T> inline T read() {
T x = 0, f = 1; char ch = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
for(; isdigit(ch); ch = getchar()) x = (x << 3) + (x << 1) + (ch - '0');
return x * f;
}
template<typename T> inline void write(T x) {
if(x < 0) putchar('-'), x = -x;
if(x > 9) write(x / 10);
putchar(x % 10 + '0');
}
template<typename T> inline void print(T x, char ed = '\n') {
write(x), putchar(ed);
}
struct LinearBase {
int a[33];
LinearBase() { memset(a, 0, sizeof a); }
void insert(int x) {
for(int i = 32; i >= 0; -- i) {
if(!((x >> i) & 1)) continue;
if(!a[i]) {
a[i] = x;
return ;
}
x ^= a[i];
}
}
LinearBase operator + (const LinearBase &other) const {
LinearBase ret;
memcpy(ret.a, a, sizeof a);
for(int i = 32; i >= 0; -- i)
if(other.a[i]) ret.insert(other.a[i]);
return ret;
}
int query() {
int ret = 0;
for(int i = 32; i >= 0; -- i)
ret = max(ret, (ret ^ a[i]));
return ret;
}
} tr[N << 2];
void pushup(int p) {
tr[p] = tr[p << 1] + tr[p << 1 | 1];
}
void modify(int p, int l, int r, int i, int k) {
if(l == i && r == i) {
tr[p].insert(k);
return ;
}
int mid = (l + r) >> 1;
if(i <= mid) modify(p << 1, l, mid, i, k);
else modify(p << 1 | 1, mid + 1, r, i, k);
pushup(p);
}
LinearBase query(int p, int l, int r, int ql, int qr) {
if(ql <= l && r <= qr) return tr[p];
int mid = (l + r) >> 1;
LinearBase ret;
if(ql <= mid) ret = ret + query(p << 1, l, mid, ql, qr);
if(qr > mid) ret = ret + query(p << 1 | 1, mid + 1, r, ql, qr);
return ret;
}
int n, m;
signed main() {
n = read<int>(), m = read<int>();
while(n --) {
int opt = read<int>();
if(opt == 1) {
int p = read<int>(), k = read<int>();
modify(1, 1, m, p, k);
} else {
int l = read<int>(), r = read<int>();
print(query(1, 1, m, l, r).query());
}
}
return 0;
}