#pragma GCC optimize("Ofast,unroll-all-loops")
#include <bits/stdc++.h>
using namespace std;
const int N = 250000;
int64_t seg[4 * N], segmin[4 * N], segmax[4 * N], lazy[8 * N];
void 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;
}
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] += 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] -= 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;
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 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 query(2 * v, tl, tm, idx) + query(2 * v + 1, tm + 1, tr, idx);
}
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);
if (b < sz) {
cout << "1\n";
} else {
cout << "0\n";
}
}
}
}