#include <bits/stdc++.h>
using namespace std;
const int inf = 2e9;
using pii = pair<int, int>;
const int N = 1e5 + 10;
int n, m, q, a[N], b[N], c[N];
struct Segmentree {
int t[N * 4];
void pull(int i) {
t[i] = max(t[i * 2], t[i * 2 + 1]);
}
void build(int i, int b, int e) {
if (b == e) return void(t[i] = c[b]);
int mid = (b + e) / 2;
build(i * 2, b, mid);
build(i * 2 + 1, mid + 1, e);
pull(i);
}
void build() {
build(1, 0, n);
}
void update(int i, int b, int e, int x, int v) {
if (b == e) return void(t[i] = v);
int mid = (b + e) / 2;
if (x <= mid) update(i * 2, b, mid, x, v);
else update(i * 2 + 1, mid + 1, e, x, v);
pull(i);
}
void update(int x, int v) {
update(1, 0, n, x, v);
}
int walkLeft(int i, int b, int e, int x, int v) {
if (x < b || t[i] <= v) return -1;
if (b == e) return b;
int mid = (b + e) / 2;
int ans = walkLeft(i * 2 + 1, mid + 1, e, x, v);
if (ans == -1) ans = walkLeft(i * 2, b, mid, x, v);
return ans;
}
int walkLeft(int x, int v) {
return walkLeft(1, 0, n, x, v);
}
int walkRight(int i, int b, int e, int x, int v) {
if (e < x || t[i] <= v) return -1;
if (b == e) return b;
int mid = (b + e) / 2;
int ans = walkRight(i * 2, b, mid, x, v);
if (ans == -1) ans = walkRight(i * 2 + 1, mid + 1, e, x, v);
return ans;
}
int walkRight(int x, int v) {
return walkRight(1, 0, n, x, v);
}
}
st;
int main() {
cin.tie(nullptr)->ios_base::sync_with_stdio(false);
cin >> n >> m;
for (int i = 1; i <= m; i++) {
cin >> a[i] >> b[i] >> c[i];
}
c[0] = c[n] = inf;
st.build();
cin >> q;
while (q--) {
int type;
cin >> type;
if (type == 1) {
int x, v;
cin >> x >> v;
st.update(x, v);
}
else {
int s, val;
cin >> s >> val;
int l = st.walkLeft(s - 1, val);
int r = st.walkRight(s, val);
cout << r - l << "\n";
}
}
}