제출 #1337574

#제출 시각아이디문제언어결과실행 시간메모리
1337574NikoBaoticMostovi (COI14_mostovi)C++20
60 / 100
49 ms864 KiB
#include "bits/stdc++.h"

using namespace std;

typedef long long ll;
typedef pair<ll, ll> pii;

#define F first
#define S second
#define FIO ios_base::sync_with_stdio(false); cin.tie(0)
#define sz(x) ((int)((x).size()))
#define all(x) x.begin(), x.end()
#define pb push_back
#define uid(a, b) uniform_int_distribution<int>(a, b)(rng)

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int N = 4e3 + 10;

int n, m;
map<int, bool> imp;
int qu[N][2];
char c[N];
map<int, int> comp;
int back[N];
map<pii, int> bl;
vector<int> adj[N];

bool vis[N];

void dfs(int node) {
	vis[node] = 1;
	for (int x : adj[node]) {
		if (vis[x] or bl[make_pair(node, x)]) continue;
		dfs(x);
	}
}

int main() {
	FIO;

	cin >> n >> m;

	set<int> f;
	set<int> s;
	
	for (int i = 0; i < m; i++) {
		cin >> c[i] >> qu[i][0] >> qu[i][1];

		if (qu[i][0] <= n) f.insert(qu[i][0]);
		else s.insert(qu[i][0]);
		
		if (qu[i][1] <= n) f.insert(qu[i][1]);
		else s.insert(qu[i][1]);
	}

	int cur = 1;

	for (int x : f) {
		back[cur] = x;
		comp[x] = cur++;
	}

	for (int x : s) {
		back[cur] = x;
		comp[x] = cur++;
	}

	for (int i = 0; i < m; i++) {
		qu[i][0] = comp[qu[i][0]];
		qu[i][1] = comp[qu[i][1]];
	}

	int last = -1;

	for (int x : f) {
		if (last != -1) {
			adj[last].pb(comp[x]);
		}

		last = comp[x];
	}

	last = -1;
	
	for (int x : s) {
		if (last != -1) {
			adj[comp[x]].pb(last);
		}

		last = comp[x];
	}

	last = -1;

	for (int i = 0; i < m; i++) {
		if (c[i] == 'Q') {
			memset(vis, 0, sizeof vis);

			dfs(qu[i][0]);

			cout << (vis[qu[i][1]] ? "DA" : "NE") << endl;
		} else if (c[i] == 'A') {
			adj[qu[i][0]].pb(qu[i][1]);
			adj[qu[i][1]].pb(qu[i][0]);
		} else {
			bl[make_pair(qu[i][0], qu[i][1])] = 1;
			bl[make_pair(qu[i][1], qu[i][0])] = 1;
		}
	}

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...