Submission #1019814

#TimeUsernameProblemLanguageResultExecution timeMemory
1019814_8_8_Bridges (APIO19_bridges)C++17
13 / 100
3052 ms10500 KiB
#include <bits/stdc++.h>
 
using namespace std;

typedef long long ll;
const int  N = 1e5 + 20, MOD = (int)1e9+7;

int n,m;
array<int,3> e[N],qr[N];
int q;
int t[N],p[N],sz[N];
int bf[N];
vector<array<int,4>>rb;
int get(int v){
    if(p[v] == v) return v;
    return get(p[v]);
}
bool merge(int a,int b){
    a = get(a);
    b = get(b);
    if(a == b) return false;
    if(sz[a] > sz[b]){
        swap(a,b);
    }
    rb.push_back({a,p[a],b,sz[b]});
    p[a] = b;
    sz[b] += sz[a];
    return 1;
}
void roll_back(){
    array<int,4> k = rb.back();
    rb.pop_back();
    p[k[0]] = k[1];
    sz[k[2]] = k[3];
}
int res[N];
void test(){
    cin >> n >> m;
    for(int i = 1;i <= m;i++){
        cin >> e[i][0] >> e[i][1] >> e[i][2];
    }
    cin >> q;
    for(int i = 1;i <= q;i++){
        cin >> qr[i][0] >> qr[i][1] >> qr[i][2];
        res[i] = -1;
    }
    const int b = 1;
    for(int i = 1;i <= q;i += b){
        rb.clear();
        int r = min(q,i+b-1);
        for(int j = 1;j <= n;j++){
            p[j] = j;
            sz[j] = 1;
        }
        vector<pair<int,int>> un;
        vector<array<int,3>> c;
        vector<int> f;
        for(int j = i;j <= r;++j){
            if(qr[j][0] == 1){
                t[qr[j][1]] = i;
                bf[qr[j][1]] = e[qr[j][1]][2];
                e[qr[j][1]][2] = qr[j][2]; 
                f.push_back(j);
            }else{
                c.push_back({qr[j][2],qr[j][1],j});
            }
        }
        for(int j = 1;j <= m;j++){
            if(t[j] != i){
                un.emplace_back(e[j][2],j);
            }
        }
        sort(un.rbegin(),un.rend());
        sort(c.rbegin(),c.rend());
        int it = 0;
        for(auto [w,s,id]:c){
            while(it < (int)un.size() && un[it].first >= w){
                int j = un[it].second;
                merge(e[j][0],e[j][1]);
                it++;   
            }
            int l = 0;
            for(int j:f){ 
                int k = qr[j][1];
                if(j < id){
                    if(e[k][2] >= w&&merge(e[k][0],e[k][1])){
                        l++;
                    }
                }else{
                    // cout << p[2] << ' ' << j << ' ' << id << ' ' << e[k][0] << ' ' << e[k][1] << ' ' << get(e[k][0]) << ' ' << get(e[k][1]) << '\n';
                    if(bf[k] >= w&&merge(e[k][0],e[k][1])){
                        l++;
                    }
                }
            }
            // cout << s << ' ' << get(s) << ' ' << sz[get(s)] << ' ' << id << '\n';
            res[id] = sz[get(s)];
            while(l--){ 
                roll_back();
            }
            // return;
        }
    }
    for(int i = 1;i <= q;i++){
        if(res[i] != -1)cout << res[i] << '\n';
    }
}
int main() {
    ios_base::sync_with_stdio(false);cin.tie(0);
    int t = 1; 
    // cin >> t;
    while(t--){
        test();
    }
}
#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...