#include <bits/stdc++.h>
using namespace std;
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int n, m, q;
cin >> n >> m >> q;
vector<int64_t> seg(4 * n), segmin(4 * n), segmax(4 * n), lazy(8 * n);
auto push = [&](int v, int tl, int tr) {
seg[v] += lazy[v] * (tr - tl + 1);
segmin[v] += lazy[v];
segmax[v] += lazy[v];
lazy[2 * v] += lazy[v];
lazy[2 * v + 1] += lazy[v];
lazy[v] = 0;
};
auto 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]);
};
auto add = [&](auto &&self, 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] += del;
push(v, tl, tr);
return;
}
int tm = (tl + tr) / 2;
self(self, 2 * v, tl, tm, l, r, del);
self(self, 2 * v + 1, tm + 1, tr, l, r, del);
pull(v);
};
auto sub = [&](auto &&self, 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] -= del;
push(v, tl, tr);
return;
}
if (segmin[v] == segmax[v]) {
lazy[v] -= segmin[v];
push(v, tl, tr);
return;
}
}
int tm = (tl + tr) / 2;
self(self, 2 * v, tl, tm, l, r, del);
self(self, 2 * v + 1, tm + 1, tr, l, r, del);
pull(v);
};
auto query = [&](auto &&self, int v, int tl, int tr, int idx) {
push(v, tl, tr);
if (idx < tl || idx > tr) {
return int64_t(0);
}
if (tl == idx && idx == tr) {
return seg[v];
}
int tm = (tl + tr) / 2;
return self(self, 2 * v, tl, tm, idx) + self(self, 2 * v + 1, tm + 1, tr, idx);
};
while (q--) {
int t;
cin >> t;
if (t == 1) {
int64_t l, r, c, k;
cin >> l >> r >> c >> k;
--l, --r;
add(add, 1, 0, n - 1, l, r, k);
} else if (t == 2) {
int64_t l, r, k;
cin >> l >> r >> k;
--l, --r;
sub(sub, 1, 0, n - 1, l, r, k);
} else {
int64_t a, b;
cin >> a >> b;
--a, --b;
int64_t sz = query(query, 1, 0, n - 1, a);
if (b < sz) {
cout << "1\n";
} else {
cout << "0\n";
}
}
}
}