This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define lli long long int
#define debug(a) cout << #a << " = " << a << endl
#define debugsl(a) cout << #a << " = " << a << ", "
#define rep(i,a,b) for(int i = (a); i <= (b); i++)
#define repa(i,a,b) for(int i = (a); i >= (b); i--)
#define MAX 100000
#define w first
#define ini second.first
#define fin second.second
#define tipo first
#define x second.first
#define y second.second
#define C 1500
lli n,m,q,a,b,c,cont,l,r;
lli bfijos[MAX+2], respuestas[MAX + 2];
pair<lli, pair<lli,lli> > puentes[MAX+2];
vector< pair<lli, pair<lli,lli> > > querys;
vector<lli> porUnir[MAX + 2];
lli dsu[MAX + 2], tam[MAX + 2];
stack<lli> stackdsu;
lli sube(lli a){
while (a != dsu[a]) a = dsu[a];
return a;
}
void une(lli a, lli b, bool registra){
a = sube(a);
b = sube(b);
if (a == b) return;
if (tam[a] > tam[b]) swap(a, b);
dsu[a] = b;
tam[b] += tam[a];
if (registra) stackdsu.push(a);
}
void separa(lli a){
tam[dsu[a]] -= tam[a];
dsu[a] = a;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m;
rep(i,1,m) {
cin >> a >> b >> c;
puentes[i] = {c,{a,b}};
}
cin >> q;
cont = 1;
querys.push_back({0,{0,0}});
rep(Q,1,q) {
cin >> a >> b >> c;
querys.push_back({a,{b,c}});
}
l = 1;
r = min(l + C, q);
while(l <= q){
//preparo la cubeta
fill(bfijos, bfijos+m+2, 1);
vector<lli> fijos, cambian, procesar;
// primera vuelta
rep(i, l, r) if (querys[i].tipo == 1) bfijos[querys[i].x] = 0;
rep(i, 1, m) if(bfijos[i]) fijos.push_back(i); else cambian.push_back(i);
// segunda vuelta
rep(i, l, r){
if (querys[i].tipo == 1) puentes[querys[i].x].w = querys[i].y;
else {
for(auto puente : cambian){
if (puentes[puente].w >= querys[i].y) porUnir[i].push_back(puente);
}
procesar.push_back(i);
}
}
//proceso la cubeta
sort(fijos.begin(), fijos.end(), [&](lli a, lli b){return puentes[a].w > puentes[b].w;});
sort(procesar.begin(), procesar.end(), [&](lli a, lli b){return querys[a].y > querys[b].y;});
// inicializa dsu
fill(tam + 1, tam + n + 1, 1);
iota(dsu, dsu + n + 1, 0);
a = b = 0;
while (b < procesar.size()){
lli idq = procesar[b];
while (a < fijos.size() && puentes[fijos[a]].w >= querys[idq].y){
une(puentes[fijos[a]].ini, puentes[fijos[a]].fin, false);
++a;
}
for(auto var : porUnir[idq]) une(puentes[var].ini, puentes[var].fin, true);
lli tmp = sube(querys[idq].x);
respuestas[idq] = tam[tmp];
while(!stackdsu.empty()){
separa(stackdsu.top());
stackdsu.pop();
}
b++;
}
l = r + 1;
r = min(l + C, q);
}
rep(i, 1, q){
if (querys[i].tipo == 2) cout << respuestas[i] << "\n";
}
}
Compilation message (stderr)
bridges.cpp: In function 'int main()':
bridges.cpp:101:18: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
101 | while (b < procesar.size()){
| ~~^~~~~~~~~~~~~~~~~
bridges.cpp:104:22: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
104 | while (a < fijos.size() && puentes[fijos[a]].w >= querys[idq].y){
| ~~^~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |