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 <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3")
const int N = 1e5+10;
const int S = 2e3;
struct dsu {
struct save {
int v, u, szv, szu;
save() {};
save(int _v, int _u, int _szv, int _szu) : v(_v), u(_u), szv(_szv), szu(_szu) {}
};
vector<int> p, sz;
vector<save> op;
void init(int n) {
p.resize(n+1), sz.resize(n+1);
for (int i=0; i<=n; ++i) p[i]=i, sz[i]=1;
}
int f(int x) {
while (p[x] != x) x=p[x];
return x;
}
bool mrg(int v, int u) {
v=f(v), u=f(u);
if (v == u) return false;
if (sz[u] > sz[v]) swap(v, u);
op.push_back(save(v, u, sz[v], sz[u]));
sz[v]+=sz[u]; p[u]=v;
return true;
}
void roll() {
if (op.empty()) return;
save x=op.back(); op.pop_back();
p[x.v]=x.v, p[x.u]=x.u;
sz[x.v]=x.szv, sz[x.u]=x.szu;
}
};
int n, m, q, a[N], b[N], w[N], tpw[N], t[N], x[N], y[N], ans[N], qs[N], chv[N], unchv[N];
bool us[N], chg[N];
void fs(int &number) {
register int c;
number = 0;
c = getchar();
for (; (c>47 && c<58); c=getchar()) number = number*10+c-48;
}
bool cmpw(int i, int j) {
return w[i] > w[j];
}
bool cmpq(int i, int j) {
return y[i] > y[j];
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(NULL);
cout.tie(NULL);
fs(n), fs(m);
for (int i=1; i<=m; ++i) fs(a[i]), fs(b[i]), fs(w[i]);
fs(q);
for (int i=1; i<=q; ++i) fs(t[i]), fs(x[i]), fs(y[i]);
for (int l=1; l<=q; l+=S) {
int r=min(q, l+S-1);
int qsz=0, chsz=0, unchsz=0;
for (int i=l; i<=r; ++i) {
if (t[i] == 1) chg[x[i]]=true;
else qs[qsz++]=i;
} sort(qs, qs+qsz, cmpq);
for (int i=1; i<=m; ++i) {
tpw[i]=w[i];
if (chg[i]) chv[chsz++]=i;
else unchv[unchsz++]=i;
} sort(unchv, unchv+unchsz, cmpw);
dsu d; d.init(n+1);
int p=0;
for (int h=0; h<qsz; ++h) {
int u=qs[h];
int wu=y[u]; assert(t[u] == 2);
while (p < unchsz) {
if (wu <= w[unchv[p]]) {
d.mrg(a[unchv[p]], b[unchv[p]]), ++p;
} else break;
}
for (int i=l; i<u; ++i) {
if (t[i] == 2) continue;
tpw[x[i]]=y[i];
}
int cnt=0;
for (int j=0; j<chsz; ++j) {
int g=chv[j];
if (tpw[g] >= wu) cnt+=d.mrg(a[g], b[g]);
tpw[g]=w[g];
} ans[u]=d.sz[d.f(x[u])];
while (cnt--) d.roll();
}
for (int i=l; i<=r; ++i) {
if (t[i] == 2) continue;
w[x[i]]=y[i], chg[x[i]]=false;
}
}
for (int i=1; i<=q; ++i) {
if (t[i] == 2) printf("%d\n", ans[i]);
}
}
# | 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... |