Submission #1354042

#TimeUsernameProblemLanguageResultExecution timeMemory
1354042idkcpBridges (APIO19_bridges)C++20
17 / 100
1487 ms13036 KiB
/**
 *       author:  Vi Gia Huy
 *    Vi Gia Huy will win APIO
**/

#include <bits/stdc++.h>

using namespace std;

const long long INF = (1ll<<60);
const int N = 5e4 + 3;
const int Q = 1e5 + 6;
int n, m, q;

struct Node {
    int to;
    long long d;
    int id;
};

vector<Node> adj[N];

struct Query {
    int type;

    int b;
    long long r;

    int s;
    long long w;
} qu[Q];

namespace sub1 {
    bool check[N];

    int dfs(int u, long long w) {
        int res = 1;
        for (Node it : adj[u]) {
            int v = it.to;
            long long d = it.d;
            if (check[v]) continue;
            if (w <= d) {
                check[v] = true;
                res += dfs(v, w);
            }
        }
        return res;
    }

    void sol() {
        for (int qi = 1; qi <= q; qi++) {
            if (qu[qi].type == 1) {
                for (int i = 1; i <= n; i++) {
                    for (Node& it : adj[i]) {
                        if (it.id == qu[qi].b) {
                            it.d = qu[qi].r;
                        }
                    }
                }
            }
            else {
                for (int i = 1; i <= n; i++) check[i] = false;
                check[qu[qi].s] = true;
                int res = dfs(qu[qi].s, qu[qi].w);
                cout << res << "\n";
            }
        }

        return;
    }
}

namespace sub2 {
    long long st[4 * N];

    void update(int id, int l, int r, int pos, long long val) {
        if (r < pos || pos < l) return;
        if (l == r) {
            st[id] = val;
            return;
        }
        int mid = (l + r) / 2;
        update(2 * id, l, mid, pos, val);
        update(2 * id + 1, mid + 1, r, pos, val);
        st[id] = min(st[2 * id], st[2 * id + 1]);
        return;
    }

    long long get(int id, int l, int r, int u, int v) {
        if (v < l || r < u) return INF;
        if (u <= l && r <= v) return st[id];
        int mid = (l + r ) / 2;
        return min(get(2 * id, l, mid, u, v), get(2 * id + 1, mid + 1, r, u, v));
    }

    void sol() {
        for (int i = 1; i < 4 * N; i++) st[i] = INF;

        for (int i = 1; i < n; i++) {
            for (Node it : adj[i]) {
                if (it.to == i + 1) {
                    update(1, 1, n, i, it.d);
                }
            }
        }

        for (int qi = 1; qi <= q; qi++) {
            if (qu[qi].type == 1) {
                update(1, 1, n, qu[qi].b, qu[qi].r);
            }
            else {
                long long w = qu[qi].w;
                int s = qu[qi].s;
                long long res = 1;
                int l = 1;
                int r = n - s;
                int cnt = 0;
                while (l <= r) {
                    int mid = (l + r) / 2;
                    int v = s + mid - 1;
                    long long mn = get(1, 1, n, s, v);
                    if (w <= mn) {
                        l = mid + 1;
                        cnt = mid;
                    }
                    else r = mid - 1;
                }
                res += cnt;
                cnt = 0;
                l = 1;
                r = s - 1;
                while (l <= r) {
                    int mid = (l + r) / 2;
                    int v = s - mid;
                    long long mn = get(1, 1, n, v, s - 1);
                    if (w <= mn) {
                        l = mid + 1;
                        cnt = mid;
                    }
                    else r = mid - 1;
                }
                res += cnt;

                cout << res << "\n";
            }
        }

        return;
    }
}

namespace sub3 {
    int sz[N];
    long long mn[N];
    long long f[N];

    void pull(int u) {
        mn[u] = INF;
        int v1 = 2 * u;
        int v2 = 2 * u + 1;
        if (v1 <= n) {
            mn[u] = min({mn[u], f[v1], mn[v1]});
        }
        if (v2 <= n) {
            mn[u] = min({mn[u], f[v2], mn[v2]});
        }
    }

    void dfs(int u) {
        sz[u] = 1;
        mn[u] = INF;
        int v1 = 2 * u;
        int v2 = 2 * u + 1;
        if (v1 <= n) {
            dfs(v1);
            sz[u] += sz[v1];
        }
        if (v2 <= n) {
            dfs(v2);
            sz[u] += sz[v2];
        }
        pull(u);
        return;
    }

    int query(int u, long long w) {
        if (w <= mn[u]) return sz[u];
        int res = 1;
        int v1 = 2 * u;
        int v2 = 2 * u + 1;
        if (v1 <= n && f[v1] >= w) {
            res += query(v1, w);
        }
        if (v2 <= n && f[v2] >= w) {
            res += query(v2, w);
        }
        return res;
    }

    void sol() {
        for (int u = 1; u <= n; u++) {
            for (Node it : adj[u]) {
                int v = it.to;
                long long d = it.d;
                if (v > u) {
                    f[v] = d;
                }
            }
        }

        dfs(1);

        for (int qi = 1; qi <= q; qi++) {
            if (qu[qi].type == 1) {
                int u = qu[qi].b + 1;
                f[u] = qu[qi].r;
                u /= 2;
                while (u >= 1) {
                    long long tmp = mn[u];
                    pull(u);
                    if (tmp == mn[u]) break;
                    u /= 2;
                }
            }
            else {
                int u = qu[qi].s;
                long long w = qu[qi].w;

                while (u > 1 && f[u] >= w) {
                    u /= 2;
                }

                cout << query(u, w) << "\n";
            }
        }

        return;
    }
}

namespace sub4 {
    void sol() {

        return;
    }
}

namespace sub5 {
    void sol() {

        return;
    }
}

namespace sub6 {
    void sol() {

        return;
    }
}

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

    bool checksub2 = true;
    bool checksub3 = false;
    bool checksub4 = true;

    int tmp = 1;
    for (int k = 1; k <= 15; k++) {
        tmp *= 2;
        if (n == tmp - 1) checksub3 = true;
    }

    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int u, v; cin >> u >> v;
        long long d; cin >> d;
        adj[u].push_back({v, d, i});
        adj[v].push_back({u, d, i});
        if (u != i || v != i + 1) checksub2 = false;
        if (u != (i + 1) / 2 || v != i + 1) checksub3 = false;
    }

    cin >> q;
    for (int i = 1; i <= q; i++) {
        cin >> qu[i].type;
        if (qu[i].type == 1) cin >> qu[i].b >> qu[i].r;
        else cin >> qu[i].s >> qu[i].w;
        if (qu[i].type == 1) checksub4 = false;
    }

    sub3::sol();

    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...