Submission #860054

#TimeUsernameProblemLanguageResultExecution timeMemory
860054TahirAliyevBridges (APIO19_bridges)C++17
0 / 100
3040 ms12092 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define pii pair<int, int>

const int MAX = 1e5 + 5, BLOCK = 400;

struct E{
    int a, b, w, id;
};

int par[MAX];
vector<array<int, 4>> op;

int get(int node){
    if(par[node] < 0){
        return node;
    }
    return get(par[node]);
}

void unite(int u, int v, bool tolist = false){
    u = get(u), v = get(v);
    if(u == v) return;
    if(-par[u] < -par[v]){
        swap(u, v);
    }
    if(tolist){
        op.push_back({u, v, par[u], par[v]});
    }
    par[u] += par[v];
    par[v] = u;
}

void rollback(){
    while(!op.empty()){
        array<int, 4> a = op.back();
        op.pop_back();
        par[a[0]] = a[2];
        par[a[1]] = a[3];
    }
}

int n, m, q;

vector<E> edges;
array<int, 3> queries[MAX];
int ans[MAX];

vector<E> ed;
vector<array<int, 3>> s;
vector<int> updated[MAX];
vector<int> updates;

bool comp(E a, E b){
    return a.w < b.w;
}

void clean(){
    memset(par, -1, sizeof(par));
    for(int a:updates){
        updated[a].clear();
    }
    updates.clear();
    ed = edges;
    op.clear();
    s.clear();
    sort(ed.rbegin(), ed.rend(), comp);
}

int main(){
    cin >> n >> m;
    for(int i = 1; i <= m; i++){
        E e;
        cin >> e.a >> e.b >> e.w;
        e.id = i;
        edges.push_back(e);
    }
    cin >> q;
    for(int i = 1; i <= q; i++){
        cin >> queries[i][0] >> queries[i][1] >> queries[i][2];
    }

    for(int i = 1; i <= q; i += BLOCK){
        clean();
        for(int j = i; j <= i + BLOCK - 1 && j <= q; j++){
            if(queries[j][0] == 2){
                s.push_back({queries[j][2], queries[j][1], j});
            }
            else{
                if(updated[queries[j][1]].empty()){
                    updates.push_back(queries[j][1]);
                }
                updated[queries[j][1]].push_back(j);
            }
        }

        sort(s.rbegin(), s.rend());
        auto itr = ed.begin();
        for(auto a : s){
            while(itr != ed.end() && itr->w >= a[0]){
                if(updated[itr->id].empty()){
                    unite(itr->a, itr->b);
                }
                itr++;
            }
            for(int p : updates){
                int b = -1;
                for(int u : updated[p]){
                    if(u < a[2]){
                        b = u;
                    }
                }
                if(b == -1){
                    if(edges[p - 1].w >= a[0]){
                        unite(edges[p - 1].a, edges[p - 1].b, 1);
                    }
                }
                else{
                    if(queries[b][2] >= a[0]){
                        unite(edges[p - 1].a, edges[p - 1].b, 1);
                    }
                }
            }
            ans[a[2]] = -par[get(a[1])];
            rollback();
        }
        for(int u : updates){
            edges[queries[u][1] - 1].w = queries[u][2];
        }
    }

    for(int i = 1; i <= q; i++){
        if(queries[i][0] == 1) continue; 
        cout << ans[i] << '\n';
    }
}
#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...