Submission #3169

#TimeUsernameProblemLanguageResultExecution timeMemory
3169myungwoo간선 파괴 (GA5_destroy)C++98
100 / 100
2176 ms3260 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...