#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
template<class T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
#define ll long long
#define lc id*2
#define rc id*2+1
#define smid (nl+nr)/2
const int N = 3e5 + 5;
ll a[N * 4], b[N * 4];
void rel (int nl, int nr, int id) {
if (nl == nr - 1) return;
//lc
if (a[lc] >= b[id]) a[lc] -= b[id];
else {
b[lc] += b[id] - a[lc];
a[lc] = 0;
}
a[lc] += a[id];
//rc
if (a[rc] >= b[id]) a[rc] -= b[id];
else {
b[rc] += b[id] - a[rc];
a[rc] = 0;
}
a[rc] += a[id];
//
a[id] = b[id] = 0;
return;
}
void inc (int ql, int qr, int nl, int nr, int id, ll val) {
rel(nl, nr, id);
if (ql >= nr || nl >= qr) return;
if (ql <= nl && nr <= qr) {
a[id] += val;
return;
}
inc(ql, qr, nl, smid, lc, val);
inc(ql, qr, smid, nr, rc, val);
return;
}
void dec (int ql, int qr, int nl, int nr, int id, ll val) {
rel(nl, nr, id);
if (ql >= nr || nl >= qr) return;
if (ql <= nl && nr <= qr) {
if (a[id] >= val) a[id] -= val;
else {
b[id] += val - a[id];
a[id] = 0;
}
return;
}
dec(ql, qr, nl, smid, lc, val);
dec(ql, qr, smid, nr, rc, val);
return;
}
pair<int, int> get (int nl, int nr, int id, int ind) {
rel(nl, nr, id);
if (nl == nr - 1) {
return pair(a[id], b[id]);
}
if (ind < smid) return get(nl, smid, lc, ind);
else return get(smid, nr, rc, ind);
}
int n, m, q;
int main(){
cin >> n >> m >> q;
if (m != 1) return 0;
for (int i = 1; i <= q; i++) {
int t; cin >> t;
if (t == 1) {
int l, r, c, k; cin >> l >> r >> c >> k;
inc(l, r + 1, 1, n + 1, 1, k);
}
if (t == 2) {
int l, r, k; cin >> l >> r >> k;
dec(l, r + 1, 1, n + 1, 1, k);
}
if (t == 3) {
ll A, B; cin >> A >> B;
pair<int, int> p = get(1, n + 1, 1, A);
if (p.first >= B) cout << "1\n";
else cout << "0\n";
}
}
}