#include <bits/stdc++.h>
using namespace std;
const int N = 250000;
struct add_set {
bool has_set;
int64_t add, set;
add_set() : add(0), set(0), has_set(false) {}
};
add_set get_add(int64_t add) {
add_set res;
res.has_set = false;
res.add = add;
return res;
}
add_set get_set(int64_t set) {
add_set res;
res.has_set = true;
res.set = set;
return res;
}
add_set operator+(const add_set &pr, const add_set &a) {
if (pr.has_set) {
add_set ans = pr;
if (a.has_set) {
ans.set = a.set;
} else {
ans.set += a.add;
}
return ans;
} else {
if (a.has_set) {
return a;
}
add_set ans = pr;
ans.add += a.add;
return ans;
}
}
int64_t seg[4 * N], segmin[4 * N], segmax[4 * N];
add_set lazy[8 * N];
void push(int v, int tl, int tr) {
if (lazy[v].has_set) {
seg[v] = lazy[v].set * (tr - tl + 1);
segmin[v] = segmax[v] = lazy[v].set;
lazy[2 * v] = lazy[2 * v] + lazy[v];
lazy[2 * v + 1] = lazy[2 * v + 1] + lazy[v];
lazy[v].has_set = false;
} else if (lazy[v].add != 0) {
seg[v] += lazy[v].add * (tr - tl + 1);
segmin[v] += lazy[v].add;
segmax[v] += lazy[v].add;
lazy[2 * v] = lazy[2 * v] + lazy[v];
lazy[2 * v + 1] = lazy[2 * v + 1] + lazy[v];
lazy[v].add = 0;
}
}
void pull(int v) {
seg[v] = seg[2 * v] + seg[2 * v + 1];
segmin[v] = min(segmin[2 * v], segmin[2 * v + 1]);
segmax[v] = max(segmax[2 * v], segmax[2 * v + 1]);
}
void add(int v, int tl, int tr, int l, int r, int64_t del) {
push(v, tl, tr);
if (tr < l || r < tl) {
return;
}
if (l <= tl && tr <= r) {
lazy[v] = lazy[v] + get_add(del);
push(v, tl, tr);
return;
}
int tm = (tl + tr) / 2;
add(2 * v, tl, tm, l, r, del);
add(2 * v + 1, tm + 1, tr, l, r, del);
pull(v);
}
auto sub(int v, int tl, int tr, int l, int r, int64_t del) {
push(v, tl, tr);
if (tr < l || r < tl) {
return;
}
if (l <= tl && tr <= r) {
if (segmin[v] >= del) {
lazy[v] = lazy[v] + get_add(-del);
push(v, tl, tr);
return;
}
if (segmin[v] == segmax[v]) {
lazy[v] = lazy[v] + get_add(-segmin[v]);
push(v, tl, tr);
return;
}
if (segmax[v] <= del) {
lazy[v] = lazy[v] + get_set(0);
push(v, tl, tr);
return;
}
}
int tm = (tl + tr) / 2;
sub(2 * v, tl, tm, l, r, del);
sub(2 * v + 1, tm + 1, tr, l, r, del);
pull(v);
}
int64_t query(int v, int tl, int tr, int l, int r) {
push(v, tl, tr);
if (tr < l || r < tl) {
return;
}
if (l <= tl && tr <= r) {
return seg[v];
}
int tm = (tl + tr) / 2;
return query(2 * v, tl, tm, l, r) + query(2 * v + 1, tm + 1, tr, l, r);
}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int n, m, q;
cin >> n >> m >> q;
while (q--) {
int t;
cin >> t;
if (t == 1) {
int64_t l, r, c, k;
cin >> l >> r >> c >> k;
--l, --r;
add(1, 0, n - 1, l, r, k);
} else if (t == 2) {
int64_t l, r, k;
cin >> l >> r >> k;
--l, --r;
sub(1, 0, n - 1, l, r, k);
} else {
int64_t a, b;
cin >> a >> b;
--a, --b;
int64_t sz = query(1, 0, n - 1, a, a);
if (b < sz) {
cout << "1\n";
} else {
cout << "0\n";
}
}
}
}