Submission #2674

#TimeUsernameProblemLanguageResultExecution timeMemory
2674tncks0121간선 파괴 (GA5_destroy)C++98
100 / 100
1736 ms2660 KiB
#include <stdio.h>
#include <memory.h>
#include <algorithm>

using namespace std;

const int N_ = 1005;
const int M_ = 200005;

int N, M, Q;
int A[M_], B[M_];

int parent[N_];

void init() { for(int i = 1; i <= N; i++) parent[i] = i; }

int get(int 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 (int a, int b) {
    a = get(a); b = get(b);
    parent[a] = b;
    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 = 0;
        scanf("%d%d", &x, &y);

        init();
        for(i = 1; i <= RN; i++) {
            if(R[i] < x || y < R[i]) merge(A[R[i]], B[R[i]]);
        }
        for(i = 1; i <= N; i++) if(get(i) == i) ++ret;
        printf("%d\n", ret);
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...