#include<bits/stdc++.h>
#include<string.h>
#include <algorithm>
#include <iterator>
#include <set>
#include <stdlib.h>
#define ll long long
#define fr first
#define sc second
#define pb push_back
#define YES cout<<"YES"<<endl
#define NO cout<<"NO"<<endl
#define endl "\n"
using namespace std;
ll a,b,c,d,e,f,m,i,j,n,h,g,mid,l,r,ka,t[205005],k[200105];
map<ll,ll> mee,see;
map<ll,ll> mii,maa;
vector<ll> vas[20005],ves;
string x,y,z,te,to;
pair<ll,ll> wefe;
stack<ll> munkh;
multiset<ll> mul;
ll tree[50005*4];
void build(ll node, ll l, ll r){
if(l==r){
tree[node]=k[l];
}
else{
ll mid=(l+r-1)/2;
build(node*2,l,mid);
build(node*2+1,mid+1,r);
tree[node]=min(tree[node*2],tree[node*2+1]);
}
}
void update(ll node, ll l, ll r, ll n, ll m){
if(l>n || r<n){
return;
}
if(l==r){
tree[node]=m;
}
else{
ll mid=(l+r-1)/2;
update(node*2,l,mid,n,m);
update(node*2+1,mid+1,r,n,m);
tree[node]=min(tree[node*2],tree[node*2+1]);
}
}
ll query(ll node, ll l, ll r, ll n, ll m){
if(n>m){
return LLONG_MAX;
}
if(r>m ||l<n){
return LLONG_MAX;
}
if(l>=n && r<=m){
return tree[node];
}
else{
ll mid=(l+r-1)/2;
return min(query(node*2,l,mid,n,m),query(node*2+1,mid+1,r,n,m));
}
}
int main(){
cin>>a>>b;
if(b==0){
cin>>ka;
while(ka--){
cin>>a>>b>>c;
if(a==2){
cout<<1<<endl;
}
}
return 0;
}
for(i=0 ; i<b ; i++){
cin>>c>>d>>k[i];
}
build(1,0,b-1);
cin>>ka;
while(ka--){
cin>>b;
if(b==1){
cin>>c>>d;
k[c-1]=d;
update(1,0,b-1,c-1,d);
}
else{
cin>>c>>d;
l=c-1;
r=b-1;
while(l<r){
m=(l+r+1)/2;
if(query(1,0,b-1,c-1,m)>=d){
l=m;
}
else{
r=m-1;
}
}
if(k[c-1]<d){
l=c-2;
}
ll ans=l-c+2;
l=0;
r=c-2;
while(l<r){
m=(l+r-1)/2;
if(query(1,0,b-1,m,c-2)>=d){
r=m;
}
else{
l=m+1;
}
}
if(k[c-2]<d){
l=c-1;
}
ans+=(c-1)-l;
ans++;
cout<<ans<<endl;
}
}
}