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 <stdio.h>
#define MAXN 707
#define MAXM 123460
int N,M,Q;
int mom[MAXN],prev[MAXM],next[MAXM];
bool fchk[MAXM],bchk[MAXM];
struct Edge{
Edge(int a=0,int b=0): a(a), b(b) {}
int a,b;
} edge[MAXM];
int _find(int n){ return mom[n]==n?n:(mom[n]=_find(mom[n])); }
int _union(int a,int b){ a = _find(a), b = _find(b); if (a != b){ mom[b] = a; return 1; } return 0; }
int main()
{
int i,k,s,e;
scanf("%d%d",&N,&M);
for (i=1;i<=M;i++) scanf("%d%d",&s,&e), edge[i] = Edge(s,e);
for (i=1;i<=N;i++) mom[i] = i;
for (i=1,k=0;i<=M;i++){
prev[i] = k;
if (_union(edge[i].a,edge[i].b)){
fchk[i] = 1;
k = i;
}
}
for (i=1;i<=N;i++) mom[i] = i;
for (i=M,k=M+1;i>0;i--){
next[i] = k;
if (_union(edge[i].a,edge[i].b)){
bchk[i] = 1;
k = i;
}
}
for (scanf("%d",&Q);Q--;){
scanf("%d%d",&s,&e);
for (i=1;i<=N;i++) mom[i] = i;
for (--s;s>0;s=prev[s]) if (fchk[s]){
_union(edge[s].a,edge[s].b);
}
for (++e;e<=M;e=next[e]) if (bchk[e]){
_union(edge[e].a,edge[e].b);
}
int ans=0;
for (i=1;i<=N;i++) if (_find(i) == i){
ans++;
}
printf("%d\n",ans);
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |