제출 #1345773

#제출 시각아이디문제언어결과실행 시간메모리
1345773killerzaluuBridges (APIO19_bridges)C++20
16 / 100
275 ms1772 KiB
#include <bits/stdc++.h>
using namespace std;

struct SegTree {
    int n;
    vector<int> seg;

    void init(int _n) {
        n = _n;
        seg.assign(4 * n + 5, (int)1e9);
    }

    void build(int v, int l, int r, vector<int>& a) {
        if (l == r) {
            seg[v] = a[l];
            return;
        }
        int mid = (l + r) / 2;
        build(2 * v, l, mid, a);
        build(2 * v + 1, mid + 1, r, a);
        seg[v] = min(seg[2 * v], seg[2 * v + 1]);
    }

    void update(int v, int l, int r, int pos, int val) {
        if (l == r) {
            seg[v] = val;
            return;
        }
        int mid = (l + r) / 2;
        if (pos <= mid) update(2 * v, l, mid, pos, val);
        else update(2 * v + 1, mid + 1, r, pos, val);
        seg[v] = min(seg[2 * v], seg[2 * v + 1]);
    }

    int query(int v, int l, int r, int a, int b) {
        if (a > b) return (int)1e9;
        if (l == a && r == b) return seg[v];
        int mid = (l + r) / 2;
        if (b <= mid) return query(2 * v, l, mid, a, b);
        if (a > mid) return query(2 * v + 1, mid + 1, r, a, b);
        return min(query(2 * v, l, mid, a, mid),
                   query(2 * v + 1, mid + 1, r, mid + 1, b));
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    cin >> n >> m;

    vector<int> a(n);
    for (int i = 1; i <= m; i++) {
        int u, v, d;
        cin >> u >> v >> d;
        a[i] = d;
    }

    SegTree seg;
    if (m > 0) {
        seg.init(m);
        seg.build(1, 1, m, a);
    }

    int q;
    cin >> q;

    while (q--) {
        int t;
        cin >> t;

        if (t == 1) {
            int b, r;
            cin >> b >> r;
            if (m > 0) seg.update(1, 1, m, b, r);
        } else {
            int s, w;
            cin >> s >> w;

            int L = s, R = s;

            int lo = 1, hi = s;
            while (lo <= hi) {
                int mid = (lo + hi) / 2;
                if (mid == s || seg.query(1, 1, m, mid, s - 1) >= w) {
                    L = mid;
                    hi = mid - 1;
                } else {
                    lo = mid + 1;
                }
            }

            lo = s, hi = n;
            while (lo <= hi) {
                int mid = (lo + hi) / 2;
                if (mid == s || seg.query(1, 1, m, s, mid - 1) >= w) {
                    R = mid;
                    lo = mid + 1;
                } else {
                    hi = mid - 1;
                }
            }

            cout << R - L + 1 << '\n';
        }
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...