제출 #1367199

#제출 시각아이디문제언어결과실행 시간메모리
1367199Nxmkxing다리 (APIO19_bridges)C++20
0 / 100
42 ms2256 KiB
#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";
        }
    }
}
    
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…