Submission #418738

#TimeUsernameProblemLanguageResultExecution timeMemory
418738MalheirosBridges (APIO19_bridges)C++17
0 / 100
3086 ms87776 KiB
#include <bits/stdc++.h>
 
using namespace std;

#define ld long double
#define ll long long
//#define int ll
#define FF first.first
#define FS first.second
#define SF second.first
#define SS second.second
#define PB push_back
#define MP make_pair
#define all(cont) cont.begin(),cont.end()
#define rall(cont) cont.rbegin(), cont.rend()
#define FOR(i, j) for(int i=0;i<j;i++)
#define RFOR(i, j) for (int i=j;i>=0;i--)
#define GO cin.tie(NULL);
#define FAST ios_base::sync_with_stdio(false);
typedef pair<int,int> pii;
 


// Your function
//DEBBUGGING STUFF, JUST USE deb(a,b,c) and it will print the variables;
#define deb(...) logger(#__VA_ARGS__, __VA_ARGS__)
template<typename ...Args>
void logger(string vars, Args&&... values) {
    cout << vars << " = ";
    string delim = "";
    (..., (cout << delim << values, delim = ", "));
    cout<<endl;
}

struct DSU{
    int* arr;
    int* size;
    stack<vector<pair<int,int>>> rb;
    int cc;
    DSU(int n){
        cc=n-1;
        arr = new int[n];
        for (int i=0;i<n;i++){
            arr[i]=-1;
        }
        rb.push(vector<pair<int,int>>());
    }
    int find(int a){
        while(arr[a]>=0)a=arr[a];
        return a;
    }
    void uniao(int a,int b){
        int paia=find(a);
        int paib=find(b);
        if (paia==paib)return;
        cc--;
        int tam=arr[paia]+arr[paib];
        if (arr[paia]>arr[paib]){
            rb.top().push_back({paib,arr[paib]});
            rb.top().push_back({paia,arr[paia]});
            arr[paia]=paib;
            arr[paib]=tam;
        }
        else{
            rb.top().push_back({paib,arr[paib]});
            rb.top().push_back({paia,arr[paia]});
            arr[paib]=paia;
            arr[paia]=tam;
        }
    }
    void persist(){
        rb.push(vector<pair<int,int>>());
    }
    void rollback(){
        auto changes=rb.top();
        rb.pop();
        int n=changes.size();
        cc+=n/2;
        for (int i=n-1;i>=0;i--){
            arr[changes[i].first]=changes[i].second;
        }
    }
};


const int maxn=5e4+10;
const int magic=230;

vector<pair<int,pii>> edges;

//qup =query update has index, {bridge , novo peso}
//qq = query query has {peso,node} index;
void solve(vector<pair<int,pii>>&qup,vector<pair<pii,int>>&qq){
    vector<pii> ans;
    vector<pair<int,pii>> unch;
    unordered_set<int> ss;
    for (auto k:qup){
        ss.insert(k.SF);
    }
   // int MMM=maxn;
    DSU dsu=DSU(maxn);
    vector<int> changed;
    FOR(i,edges.size()){
        if (ss.find(i)==ss.end()){
            unch.PB(edges[i]);
        }
        else changed.PB(i);
    }
    sort(unch.rbegin(),unch.rend());
    sort(qq.rbegin(),qq.rend());
    
    int j=0;
    for (auto k:qq){
        //cout<<"unindo"<<" ";
        //deb(k.FF,k.FS,k.second);
        for (;j<unch.size();j++){
            
            if (unch[j].first>=k.FF){
                //deb(unch[j].SF,unch[j].SS);
                dsu.uniao(unch[j].SF,unch[j].SS);
            }
            else break;
        }
        vector<pair<int,int>> mudei;
        for (auto k1:qup){
            if (k1.first<k.second){
                mudei.PB({k1.SF,edges[k1.SF].first});
                edges[k1.SF].first=k1.SS;
            }
            //else break;
        }
        dsu.persist();
        for (auto k1:changed){
            //deb(k1);
            if (edges[k1].first>=k.FF){
                //deb(edges[k1].SF,edges[k1].SS);
                dsu.uniao(edges[k1].SF,edges[k1].SS);
            }
        }
        ans.push_back({k.second,-dsu.arr[dsu.find(k.FS)]});
        dsu.rollback();
        for (auto k:mudei){
            edges[k.first].first=k.second;
        }
        //cout<<endl;
    }
    sort(ans.begin(),ans.end());
    for (auto k:qup){
        edges[k.SF].first=k.SS;
    }
    for (auto k:ans) cout<<k.second<<'\n';
}

int main(){
    GO FAST
    int n,m;
    cin>>n>>m;
    FOR(i,m){
        int a,b,c;cin>>a>>b>>c;
        edges.PB({c,{a,b}});
    }
    int q;cin>>q;
    int i=0;
    while(q>i){
        vector<pair<int,pii>> q1;
        vector<pair<pii,int>> q2;
        int t=0;
        for (int j=i;j<min(i+magic,q);j++){
            int a,b,c;cin>>a;
            if (a==1){
                int bridge,peso;
                cin>>bridge>>peso;
                q1.PB({t++,{bridge-1,peso}});
            }
            else{
                int ilha,peso;cin>>ilha>>peso;
                q2.PB({{peso,ilha},t++});
            }
        }
        solve(q1,q2);
        i+=magic;
    }
   // cout<<'\n';
}

Compilation message (stderr)

bridges.cpp: In function 'void solve(std::vector<std::pair<int, std::pair<int, int> > >&, std::vector<std::pair<std::pair<int, int>, int> >&)':
bridges.cpp:16:32: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, std::pair<int, int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   16 | #define FOR(i, j) for(int i=0;i<j;i++)
......
  103 |     FOR(i,edges.size()){
      |         ~~~~~~~~~~~~~~          
bridges.cpp:103:5: note: in expansion of macro 'FOR'
  103 |     FOR(i,edges.size()){
      |     ^~~
bridges.cpp:116:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, std::pair<int, int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  116 |         for (;j<unch.size();j++){
      |               ~^~~~~~~~~~~~
bridges.cpp: In function 'int main()':
bridges.cpp:169:19: warning: unused variable 'b' [-Wunused-variable]
  169 |             int a,b,c;cin>>a;
      |                   ^
bridges.cpp:169:21: warning: unused variable 'c' [-Wunused-variable]
  169 |             int a,b,c;cin>>a;
      |                     ^
#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...