Submission #1115802

#TimeUsernameProblemLanguageResultExecution timeMemory
1115802jay22간선 파괴 (GA5_destroy)C++17
100 / 100
29 ms5920 KiB
#include <iostream>
#include <cstring>

const int V_LEN = 702;
const int E_LEN = 123460;

int V, E, Q;
int u[E_LEN], v[E_LEN];
int pre[E_LEN], nxt[E_LEN];
int L[V_LEN], R[V_LEN];
int p[V_LEN];
int c[V_LEN][V_LEN];

int find(int i) { return p[i] < 0 ? i : p[i] = find(p[i]); }
int join(int a, int b) {
	a = find(a), b = find(b);
	if (a == b) return 0;
	if (p[a] < p[b]) p[a] += p[b], p[b] = a;
	else p[b] += p[a], p[a] = b;
	return 1;
}

int main() {
	std::cin.tie(0)->sync_with_stdio(0);
	std::cin >> V >> E;
	memset(p, -1, sizeof p);
	for (int i = 1; i <= E; ++i) {
		std::cin >> u[i] >> v[i];
		pre[i] = pre[i - 1];
		if (join(u[i], v[i])) L[pre[i]++] = i;
	}
	memset(p, -1, sizeof p);
	for (int i = E; i > 0; --i) {
		nxt[i] = nxt[i + 1];
		if (join(u[i], v[i])) R[nxt[i]++] = i;
	}
	for (int i = 0; i <= pre[E]; ++i) {
		memset(p, -1, sizeof p);
		c[i][0] = i;
		for (int j = 0; j < i; ++j) join(u[L[j]], v[L[j]]);
		for (int j = 0; j < pre[E]; ++j) {
			if (join(u[R[j]], v[R[j]])) c[i][j + 1]++;
			c[i][j + 1] += c[i][j];
		}
	}

	/*std::cout << "pre: ";
	for (int i = 0; i < pre[E]; ++i) std::cout << L[i] << ' ';
	std::cout << '\n';

	std::cout << "nxt: ";
	for (int i = 0; i < pre[E]; ++i) std::cout << R[i] << ' ';
	std::cout << '\n';

	for (int i = 0; i <= pre[E]; ++i) {
		for (int j = 0; j <= pre[E]; ++j) {
			std::cout << c[i][j] << ' ';
		}
		std::cout << '\n';
	}*/

	std::cin >> Q;
	for (int q = 0, l, r; q < Q; ++q) {
		std::cin >> l >> r;
		l = pre[l - 1], r = nxt[r + 1];
		// std::cout << "query: " << l << ' ' << r << ' ';
		std::cout << V - c[l][r] << '\n';
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...