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>
#include <memory.h>
#include <algorithm>
using namespace std;
const int N_ = 1005;
const int M_ = 200005;
int N, M, Q;
short A[M_], B[M_];
short parent[N_];
short rank[N_];
void init() { for(int i = 1; i <= N; i++) parent[i] = rank[i] = i; }
short get(short u) {
int r = u;
while(parent[r] != r) r = parent[r];
while(u != r) {
int p = parent[u];
parent[u] = r;
u = p;
}
return r;
}
bool merge (short a, short b) {
a = get(a); b = get(b);
if(rank[a] < rank[b]) {
parent[a] = b;
}else if(rank[a] > rank[b]) {
parent[b] = a;
}else {
parent[b] = a;
++rank[a];
}
return a != b;
}
int R[N_*2], RN;
int main () {
int i, j, k;
scanf("%d%d", &N, &M);
for(i = 1; i <= M; i++) scanf("%d%d", A+i, B+i);
init();
for(i = 1; i <= M; i++) if(merge(A[i], B[i])) R[++RN] = i;
init();
for(i = M; i > 0; i--) if(merge(A[i], B[i])) R[++RN] = i;
scanf("%d", &Q);
while(Q--) {
int x, y, ret = N;
scanf("%d%d", &x, &y);
init();
for(i = 1; i <= RN; i++) {
if(R[i] < x || y < R[i]) if(merge(A[R[i]], B[R[i]])) --ret;
}
printf("%d\n", ret);
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |