Submission #934039

#TimeUsernameProblemLanguageResultExecution timeMemory
934039vjudge1Bridges (APIO19_bridges)C++17
43 / 100
3055 ms20084 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector <ll>;

const ll IDEM = 1E18+16;
const ll MAXN = 5E4+16;
vector <pair <ll, ll> > adj[MAXN];
vll wei;
ll vis[MAXN];
ll timer=0;

ll dfs (ll u, ll w) {
    if (vis[u]==timer) return 0;
    vis[u]=timer;
    ll ans=1;
    for (auto [v, i] : adj[u]) {
        if (wei[i] < w) continue;
        ans += dfs(v, w);
    }
    return ans;
}

#define mid ((l+r)>>1)
#define off (2*(mid-l+1))
struct SegTree {
    vll tree;
    ll n;

    SegTree (ll n): tree(2*n, IDEM), n(n) {}

    void pull (ll l, ll r, ll id) {
        tree[id] = min(tree[id+1], tree[id+off]);
    }

    void update (ll at, ll val, ll l, ll r, ll id) {
        if (at < l || r < at) return;
        if (at <= l && r <= at) {
            tree[id]=val;
            return;
        }
        update(at, val, l, mid, id+1);
        update(at, val, mid+1, r, id+off);
        pull(l, r, id);
    }

    void update (ll at, ll val) {
        update(at, val, 0, n-1, 0);
    }

    ll query (ll ql, ll qr, ll l, ll r, ll id) {
        if (qr < l || r < ql) return IDEM;
        if (ql <= l && r <= qr) return tree[id];
        return min(query(ql, qr, l, mid, id+1), query(ql, qr, mid+1, r, id+off));
    }

    ll query (ll ql, ll qr) {
        return query(ql, qr, 0, n-1, 0);
    }
};

struct Query { char type; ll a, b, i; };
struct Edge { ll u, v, w; };
vector <Edge> egs;

struct DSU {
    vll par;
    vll sz;
    ll n;
    
    DSU (ll n): par(n), sz(n, 1) {
        iota(par.begin(), par.end(), 0);
    }

    ll find (ll u) {
        return (u == par[u] ? u : par[u] = find(par[u]));
    }

    void join (ll u, ll v) {
        u = find(u);
        v = find(v);
        if (u == v) return;
        if (sz[u] > sz[v]) swap(u, v);
        par[u] = v;
        sz[v] += sz[u];
    }

    ll findSize (ll u) {
        return sz[find(u)];
    }
};

int main () {
    cin.tie(nullptr) -> sync_with_stdio(false);
    ll n, m;
    cin >> n >> m;
    SegTree st(m);
    bool isL = (n-1==m);
    for (ll i = 0; i < m; i++) {
        ll u, v, w;
        cin >> u >> v >> w;
        u--; v--;
        isL &= (u==i && v==i+1);
        adj[u].push_back({ v, i });
        adj[v].push_back({ u, i });
        wei.push_back(w);
        egs.push_back({ u, v, w });
        st.update(i, w);
    }
    // cerr << (isL ?" IS LINE ": "NO LINE") << '\n';
    if (isL) {
    ll Q;
    cin >> Q;
    while (Q--) {
        char type;
        cin >> type;
        switch (type) {
            case '1':
            {ll i, w;
            cin >> i >> w;
            i--;
            st.update(i, w);}
            break;
            case '2':
            {ll u, w;
            cin >> u >> w;
            u--;
            ll ans=1;
            if (u>0 && st.query(u-1, u-1) >= w) { // to the left
                ll l=-1, r=u-1;
                while (l+1 < r) {
                    ll midBS = (l+r)>>1;
                    ll ww = st.query(midBS, r);
                    if (ww < w) {
                        l = midBS;
                    } else {
                        r = midBS;
                    }
                }
                ans += u-r;
            }
            if (u<m && st.query(u, u) >= w) {
                ll l=u, r=m;
                while (l+1 < r) {
                    ll midBS = (l+r)>>1;
                    ll ww = st.query(l, midBS);
                    if (ww < w) {
                        r = midBS;
                    } else {
                        l = midBS;
                    }
                }
                ans += l-u+1;
            }
            cout << ans << '\n';
            }
            break;
        }
    }
    } else {
        ll Q;
        cin >> Q;
        vector <Query> qs(Q);
        for (ll i = 0; i < Q; i++) qs[i].i = i;
        for (auto &[type, a, b, i] : qs) cin >> type >> a >> b;
        bool only2=true;
        for (auto [type, a, b, i] : qs) only2 &= type=='2';
        // cerr << (only2 ? "NOLY 2" : "ALOS 1") << '\n';
        if (only2) {
            sort(egs.begin(), egs.end(), [&](const Edge &a, const Edge &b) {
                return a.w > b.w;
            });
            sort(qs.begin(), qs.end(), [&](const Query &a, const Query &b) {
                return a.b > b.b;
            });
            ll p1=0;
            vll vans(Q, -16);
            DSU dsu(n);
            for (ll p2 = 0; p2 < Q; p2++) {
                while (p1 < egs.size() && egs[p1].w >= qs[p2].b) {
                    dsu.join(egs[p1].u, egs[p1].v);
                    p1++;
                }
                vans[qs[p2].i] = dsu.findSize(qs[p2].a-1);
            }
            for (ll i : vans) cout << i << '\n';
        } else {
            for (auto [type, a, b, i] : qs) {
                switch (type) {
                    case '1':
                    {ll i, w;
                    i=a, w=b;
                    i--;
                    wei[i] = w;}
                    break;
                    case '2':
                    {ll u, w;
                    u=a, w=b;
                    u--;
                    timer++;
                    cout << dfs(u, w) << '\n';}
                    break;
                }
            }
        }
    }
    return 0;
}

Compilation message (stderr)

bridges.cpp: In function 'int main()':
bridges.cpp:180:27: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<Edge>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  180 |                 while (p1 < egs.size() && egs[p1].w >= qs[p2].b) {
      |                        ~~~^~~~~~~~~~~~
#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...