#include <bits/stdc++.h>
using namespace std;
const int N = 4e5 + 5;
int sTree[N];
struct SegmentTree{
    
    void Build(int node, int l, int r, vector<int>&v){
        if(l == r){
            sTree[node] = v[l];
        }
        else{
            int mid = (l + r) / 2;
            Build(node * 2, l, mid, v);
            Build(node * 2 + 1, mid + 1, r, v);
            sTree[node] = min(sTree[node * 2], sTree[node * 2 + 1]);
        }
    }
    void Update(int node, int l, int r, int pos, int val){
        if(l == r){
            sTree[node] = val;
        }
        else{
            int mid = (l + r) / 2;
            if(pos <= mid){
                Update(node * 2, l, mid, pos, val);
            }
            else{
                Update(node * 2 + 1, mid + 1, r, pos, val);
            }
            sTree[node] = min(sTree[node * 2], sTree[node * 2 + 1]);
        }
    }
    int Query1(int node, int l, int r, int ql, int qr, int w){
        int mid = (l + r) / 2;
        if(ql <= l && r <= qr){
            if(l == r){
                if(sTree[node] < w)return l;
                else return -1;
            }
            else{
                if(sTree[node * 2] < w)return Query1(node * 2, l, mid, ql, qr, w);
                return Query1(node * 2 + 1, mid + 1, r, ql, qr, w);
            }
        }
        if(ql > r || l > qr)return -1;
        int lc = Query1(node * 2, l, mid, ql, qr, w);
        if(lc == -1)return Query1(node * 2 + 1, mid + 1, r, ql, qr, w);
        return lc;
    }
    int Query2(int node, int l, int r, int ql, int qr, int w){
        int mid = (l + r) / 2;
        if(ql <= l && r <= qr){
            if(l == r){
                if(sTree[node] < w)return l;
                else return -1;
            }
            else{
                if(sTree[node * 2 + 1] < w)return Query2(node * 2 + 1, mid + 1, r, ql, qr, w);
                return Query2(node * 2, l, mid, ql, qr, w);
            }
        }
        if(ql > r || l > qr)return -1;
        int rc = Query2(node * 2 + 1, mid + 1, r, ql, qr, w);
        if(rc == -1)return Query2(node * 2, l, mid, ql, qr, w);
        return rc;
    }
};
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, m;
    cin >> n >> m;
    vector<int>e(n);
    for(int i = 1;i < n;++i){
        int u, v, w;
        cin >> u >> v >> w;
        e[i] = w;
    }
    SegmentTree tree;
    tree.Build(1, 1, n - 1, e);
    int q;
    cin >> q;
    while(q--){
        int type;
        cin >> type;
        if(type == 1){
            int b, r;
            cin >> b >> r;
            tree.Update(1, 1, n - 1, b, r);
        }
        else{
            int s, w;
            cin >> s >> w;
            int R = tree.Query1(1, 1, n - 1, s, n - 1, w), L = tree.Query2(1, 1, n - 1, 1, s - 1, w);
            if(L == -1)L = 0;
            if(R == -1)R = n;
            int res = R - L;
            cout << res << '\n';
        }
    }
}
/*
5 4
1 2 1
2 3 3
3 4 2
4 5 7
*/
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |