Submission #1293440

#TimeUsernameProblemLanguageResultExecution timeMemory
1293440guanexBridges (APIO19_bridges)C++20
100 / 100
1382 ms29224 KiB
#include<bits/stdc++.h>
/*#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>

using namespace __gnu_pbds;*/
using namespace std;

typedef long long ll;
typedef long double ld;
#define endl '\n'

//data structures

typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef vector<ll> vll;
typedef vector<ld> vld;
typedef pair<long long, long long> pll;
typedef pair<char, int> ci;
typedef pair<string, int> si;
typedef vector<int> vi;
typedef vector<string> vs;
typedef vector<vector<int>> vvi;
#define pb push_back
#define pf push_front
#define popb pop_back
#define popf pop_front
#define sz(a) ((int)a.size())
#define fi first
#define se second
#define whole(v) v.begin(), v.end()
#define rwhole(v) v.rbegin(), v.rend()
#define fro front
#define pqueue priority_queue
#define ubound upper_bound
#define lbound lower_bound
#define beg(v) v.begin()

//bit operations

int flip(int x){
    return ~(x) ^ (1 << 32);
}

int allon(int x){
    return (1LL << x) - 1;
}

bool bit(ll a, ll i){
    return (1LL << i) & a;
}

#define llpc(x) __builtin_popcountll(x)
#define ipc(x) __builtin_popcount(x)
#define iclz(x) __builtin_clz(x)
#define llclz(x) __builtin_clzll(x)
#define ictz(x) __builtin_ctz(x)
#define llctz(x) __builtin_ctzll(x)

//answers

#define cYES cout << "YES" << endl
#define cYes cout << "Yes" << endl
#define cyes cout << "yes" << endl
#define cNO cout << "NO" << endl
#define cNo cout << "No" << endl
#define cno cout << "no" << endl
#define ipsb cout << -1 << endl

const ll mod2 = 998244353;
const ll mod = 1000000007;
const int inf = int(1e9); // ll inf = ll(1e18);

// read arr vec matr etc

#define fill(x, y) memset(x, y, sizeof(x))

void read(vector<int> &x){
    for(auto &e:x) cin >> e;
}

void sread(vector<string> &x){
    for(auto &e:x) cin >> e;
}

void mread(vector<vector<int>> &p, int nnn, int mmm){
    for(int i = 0; i < nnn; ++i){
        vector<int> pp;
        for(int j = 0; j < mmm; ++j){
            int wq; cin >> wq; pp.pb(wq);
        }
        p.pb(pp);
    }
}

//typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> oset;

//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); //high quality random number generator using time as seed
//int random(int l, int r){return uniform_int_distribution<int>(l,r)(rng);} //returns a randomb number between [l, r]

// Solution

int sz[100005]; 
int fat[100005];
stack<int> stck;

int ffather(int no){
    while(no != fat[no]) no = fat[no];
    return no;
}

void join(int u, int v){
    u = ffather(u); v = ffather(v);
    if(u == v)return;
    if(sz[u] < sz[v]) swap(u, v);
    stck.push(v);
    fat[v] = u;
    sz[u] += sz[v];
}

void roll(int x){
    while(sz(stck) > x){
        int no = stck.top();
        stck.pop();
        sz[fat[no]] -= sz[no];
        fat[no] = no;
    }
}

void tc(){
    int n, m; cin >> n >> m;
    int a[m+1];
    int b[m+1];
    int we[m+1];
    for(int i = 0; i < m; ++i){
        cin >> a[i];
        a[i]--;
        cin >> b[i];
        b[i]--;
        cin >> we[i];
    }
    int t; cin >> t;
    int sq = 1000;
    int q[t+1];
    int uu[t+1];
    int vv[t+1];
    for(int i = 0; i < t; ++i){
        int g, h, j; cin >> g >> h >> j;
        q[i] = g;
        uu[i] = h;
        vv[i] = j;
    }
    bool changed[m+1];
    fill(changed, 0);
    int ans[t+1];
    vector<int> tojoin[1000];
    for(int j = 0; j < t; j += sq){
        for(int i = 0; i <= n; ++i){
            fat[i] = i;
            sz[i] = 1;
        }
        fill(changed, 0);
        int r = min(j + sq, t);
        vi toans;
        vi upd;
        for(int i = j; i < r; ++i){
            if(q[i] == 1){
                changed[uu[i]-1] = 1;
                upd.pb(i);
            }else{
                toans.pb(i);
            }
        }
        vi unchanged;
        for(int i = 0; i < m; ++i){
            if(changed[i] == 0){
                unchanged.pb(i);
            }
        }
        for(int i = j; i < r; ++i){
            if(q[i] == 1){
                we[uu[i]-1] = vv[i];
            }else{
                tojoin[i-j].clear();
                for(auto e:upd){
                    if(we[uu[e]-1] >= vv[i]) tojoin[i-j].pb(uu[e]-1);
                }
            }
        }
        sort(whole(unchanged), [&](int u, int v){return we[u] > we[v];});
        sort(whole(toans), [&](int u, int v){return vv[u] > vv[v];});
        int p = 0;
        for(auto e:toans){
            int no = uu[e]-1;
            int w = vv[e];
            for(; p < sz(unchanged); ++p){
                if(we[unchanged[p]] >= w){
                    join(a[unchanged[p]], b[unchanged[p]]);
                }else{
                    break;
                }
            }
            //cout << e << " " << no << ' ' << w << " " << j << " " << r << endl;
            int prevsz = sz(stck);
            for(auto k:tojoin[e-j]){
                join(a[k], b[k]);
            }
            int an = sz[ffather(no)];
            ans[e] = an;
            roll(prevsz);
        }
        for(int i = j; i < r; ++i){
            if(q[i] == 1){
                we[uu[i]-1] = vv[i];
            }
        }
    }
    for(int i = 0; i < t; ++i){
        if(q[i] == 2){
            cout << ans[i] << endl;
        }
    }
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int t = 1;
    //cin >> t; 
    while(t--){
        tc();
    }
}

Compilation message (stderr)

bridges.cpp: In function 'int flip(int)':
bridges.cpp:42:22: warning: left shift count >= width of type [-Wshift-count-overflow]
   42 |     return ~(x) ^ (1 << 32);
      |                    ~~^~~~~
#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...