이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
//#pragma GCC target("sse,sse2,avx2")
//#pragma GCC optimize("unroll-loops,O3")
#define rep(i,l,r) for (int i = l; i < r; i++)
#define repr(i,r,l) for (int i = r; i >= l; i--)
#define X first
#define Y second
#define all(x) (x).begin() , (x).end()
#define pb push_back
#define endl '\n'
#define debug(x) cerr << #x << " : " << x << endl;
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
constexpr int N = 2e5+10,mod = 1e9+7,sq = 2000;
constexpr ll inf = 1e18+10;
inline int mkay(int a,int b){
if (a+b >= mod) return a+b-mod;
if (a+b < 0) return a+b+mod;
return a+b;
}
inline int poww(int a,int k){
if (k < 0) return 0;
int z = 1;
while (k){
if (k&1) z = 1ll*z*a%mod;
a = 1ll*a*a%mod;
k >>= 1;
}
return z;
}
vector<pll> e;
int W[N];
int par[N],sz[N],ans[N],lst[N];
bitset<N> mark;
vector<pair<int,pll> > Q;
vector<int> ve,pors,ch;
stack<int> st;
int getpar(int v){
if (v == par[v]) return v;
return getpar(par[v]);
}
bool cmp(int i,int j){
return (W[i] > W[j]);
}
bool cmp2(int i,int j){
return (Q[i].Y.Y > Q[j].Y.Y);
}
bool mg(int i){
int u = e[i].X,v = e[i].Y;
int p1 = getpar(u),p2 = getpar(v);
if (p1 == p2) return 0;
if (sz[p2] < sz[p1]) swap(p2,p1);
par[p1] = p2;
sz[p2] += sz[p1];
st.push(p1);
return 1;
}
void undo(){
int u = st.top();
st.pop();
sz[par[u]] -= sz[u];
par[u] = u;
}
int main(){
ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n,m;
cin >> n >> m;
rep(i,0,m){
int u,v,w;
cin >> u >> v >> w;
e.pb({u,v});
W[i] = w;
}
int q;
cin >> q;
rep(i,0,q){
int t,u,v;
cin >> t >> u >> v;
if (t == 1) u--;
Q.pb({t,{u,v}});
}
for (int l = 0; l < q; l += sq){
int r = min(l+sq,q);
pors.clear();
ve.clear();
ch.clear();
mark.reset();
rep(i,l,r){
if (Q[i].X == 1) mark[Q[i].Y.X] = 1;
else pors.pb(i);
}
rep(i,0,m){
if (!mark[i]) ve.pb(i);
else{
ch.pb(i);
lst[i] = W[i];
}
}
sort(all(ve),cmp);
sort(all(pors),cmp2);
while (!st.empty()) st.pop();
rep(i,1,n+1){
par[i] = i;
sz[i] = 1;
}
int p = 0;
for (int i : pors){
for (int j : ch) lst[j] = W[j];
while (p < (int)ve.size() && W[ve[p]] >= Q[i].Y.Y){
mg(ve[p]);
p++;
}
int t = 0;
rep(j,l,i){
if (Q[j].X == 2) continue;
lst[Q[j].Y.X] = Q[j].Y.Y;
}
for (int j : ch) if (lst[j] >= Q[i].Y.Y){
t += mg(j);
}
ans[i] = sz[getpar(Q[i].Y.X)];
while (t--) undo();
}
rep(i,l,r) if (Q[i].X == 1) W[Q[i].Y.X] = Q[i].Y.Y;
}
rep(i,0,q) if (Q[i].X == 2) cout << ans[i] << endl;
}
# | 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... |