This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
/*#pragma GCC optimize("Ofast","unroll-loops","omit-frame-pointer","inline") //Optimization flags
#pragma GCC option("arch=native","tune=native","no-zero-upper") //Enable AVX
#pragma GCC target("avx2") //Enable AVX*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/rope>
#define ll long long
#define pb push_back
#define sz(x) (int)(x).size()
#define mp make_pair
#define f first
#define s second
#define all(x) x.begin(), x.end()
#define D(x) cerr << #x << " is " << (x) << "\n";
using namespace std;
using namespace __gnu_pbds;
using namespace __gnu_cxx;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
template<class T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>; ///find_by_order(),order_of_key()
template<class T1, class T2> ostream& operator<<(ostream& os, const pair<T1,T2>& a) { os << '{' << a.f << ", " << a.s << '}'; return os; }
template<class T> ostream& operator<<(ostream& os, const vector<T>& a){os << '{';for(int i=0;i<sz(a);i++){if(i>0&&i<sz(a))os << ", ";os << a[i];}os<<'}';return os;}
template<class T> ostream& operator<<(ostream& os, const deque<T>& a){os << '{';for(int i=0;i<sz(a);i++){if(i>0&&i<sz(a))os << ", ";os << a[i];}os<<'}';return os;}
template<class T> ostream& operator<<(ostream& os, const set<T>& a) {os << '{';int i=0;for(auto p:a){if(i>0&&i<sz(a))os << ", ";os << p;i++;}os << '}';return os;}
template<class T> ostream& operator<<(ostream& os, const set<T,greater<T> >& a) {os << '{';int i=0;for(auto p:a){if(i>0&&i<sz(a))os << ", ";os << p;i++;}os << '}';return os;}
template<class T> ostream& operator<<(ostream& os, const multiset<T>& a) {os << '{';int i=0;for(auto p:a){if(i>0&&i<sz(a))os << ", ";os << p;i++;}os << '}';return os;}
template<class T> ostream& operator<<(ostream& os, const multiset<T,greater<T> >& a) {os << '{';int i=0;for(auto p:a){if(i>0&&i<sz(a))os << ", ";os << p;i++;}os << '}';return os;}
template<class T1,class T2> ostream& operator<<(ostream& os, const map<T1,T2>& a) {os << '{';int i=0;for(auto p:a){if(i>0&&i<sz(a))os << ", ";os << p;i++;}os << '}';return os;}
const int N=1e5+500;
int L,M;
int u[N],v[N],w[N],last[N],qu[N],qw[N],ans[N];
vector<int> pojedinacno[N];
vector<pair<int,int> > arr[N];
int n,m,q,tr;
void add(int l,int r,int in,int w){
//printf("%i-%i %i: %i %i %i\n",l,r,in,u[in],v[in],w);
int le=l/L,ri=r/L;
if(le==ri){
if(l==le*L&&r==(ri+1)*L-1){
arr[le].pb({w,in});
return;
}
for(int i=l;i<=r;i++)
if(qw[i]<=w)
pojedinacno[i].pb(in);
return;
}
if(l==le*L)
le--;
else
for(int i=l;i<(le+1)*L;i++)
if(qw[i]<=w)
pojedinacno[i].pb(in);
if(r==(ri+1)*L-1){
for(int i=le+1;i<=ri;i++)
arr[i].pb({w,in});
}
else{
for(int i=le+1;i<ri;i++)
arr[i].pb({w,in});
for(int i=ri*L;i<=r;i++)
if(qw[i]<=w)
pojedinacno[i].pb(in);
}
}
struct DSU{
vector<int> p,siz,in,undo;
DSU(){p.resize(N);siz.resize(N,1);in.resize(N);iota(all(p),0);}
void reset(){
for(auto d:undo)
p[d]=d,in[d]=0,siz[d]=1;
undo.clear();
}
int find(int tr){return tr==p[tr]?tr:p[tr]=find(p[tr]);}
void merge(int a,int b){
a=find(a);
b=find(b);
if(!in[a])
in[a]=1,undo.pb(a);
if(a==b)
return;
if(!in[b])
in[b]=1,undo.pb(b);
if(siz[a]<siz[b]){
siz[b]+=siz[a];
p[a]=b;
}
else{
siz[a]+=siz[b];
p[b]=a;
}
}
};
void solve(){
DSU global,moj;
for(int i=0;i<M;i++){
global.reset();
vector<pair<pair<int,int>,int> > query;
for(int j=i*L;j<(i+1)*L&&~qu[j];j++)
query.pb({{qw[j],qu[j]},j});
//cout << arr[i] << query << endl;
sort(all(query));
reverse(all(query));
int ind=0;
//printf("%i:-----------------------------------\n",i);
for(auto p:query){
//printf("Racunam %i %i\n",p.f.f,p.f.s);
while(ind<arr[i].size()&&arr[i][ind].f>=p.f.f)
global.merge(u[arr[i][ind].s],v[arr[i][ind].s]),ind++;
moj.reset();
for(auto d:pojedinacno[p.s]){
int uu=global.find(u[d]),vv=global.find(v[d]);
//printf("Moj %i %i %i %i\n",uu,vv,moj.siz[uu],moj.siz[vv]);
if(moj.siz[uu]<global.siz[uu])
moj.siz[uu]=global.siz[uu];
if(moj.siz[vv]<global.siz[vv])
moj.siz[vv]=global.siz[vv];
//printf("Moj %i %i %i %i\n",uu,vv,moj.siz[uu],moj.siz[vv]);
moj.merge(uu,vv);
}
ans[p.s]=max(moj.siz[moj.find(global.find(p.f.s))],global.siz[moj.find(global.find(p.f.s))]);
}
for(int j=i*L;j<(i+1)*L&&~qu[j];j++)
printf("%i\n",ans[j]);
}
}
int main()
{
for(int i=0;i<N;i++)
qu[i]=-1;
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
//n=50000;
//m=100000;
//int d=1e9;
scanf("%i %i",&n,&m);
for(int i=0;i<m;i++){
//u[i]=rng()%n;v[i]=rng()%n;w[i]=rng()%d;
scanf("%i %i %i",&u[i],&v[i],&w[i]),u[i]--,v[i]--;
}
//q=100000;
scanf("%i",&q);
vector<tuple<int,int,int,int> > ad;
for(int i=0;i<q;i++){
int t,a,b;
//t=rng()%2+1;
//a=rng()%n;
//b=rng()%d;
scanf("%i %i %i",&t,&a,&b);
a--;
if(t==2){
qu[tr]=a;
qw[tr++]=b;
}else{
if(last[a]!=tr)
ad.pb(make_tuple(w[a],tr-1,a,last[a]));
last[a]=tr;
w[a]=b;
}
}
for(int i=0;i<m;i++)
if(last[i]!=tr)
ad.pb(make_tuple(w[i],tr-1,i,last[i]));
int d=sqrt(tr);
L=d;
if(tr==q)
L=tr;
M=N/L;
sort(all(ad));
reverse(all(ad));
for(auto p:ad){
int a,b,c,d;
tie(d,b,c,a)=p;
add(a,b,c,d);
}
solve();
return 0;
}
Compilation message (stderr)
bridges.cpp: In function 'void solve()':
bridges.cpp:114:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
114 | while(ind<arr[i].size()&&arr[i][ind].f>=p.f.f)
| ~~~^~~~~~~~~~~~~~
bridges.cpp: In function 'int main()':
bridges.cpp:135:5: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
135 | for(int i=0;i<N;i++)
| ^~~
bridges.cpp:142:2: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
142 | scanf("%i %i",&n,&m);
| ^~~~~
bridges.cpp:142:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
142 | scanf("%i %i",&n,&m);
| ~~~~~^~~~~~~~~~~~~~~
bridges.cpp:145:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
145 | scanf("%i %i %i",&u[i],&v[i],&w[i]),u[i]--,v[i]--;
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bridges.cpp:148:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
148 | scanf("%i",&q);
| ~~~~~^~~~~~~~~
bridges.cpp:155:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
155 | scanf("%i %i %i",&t,&a,&b);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~
# | 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... |