#include <stdio.h>
#include <stdlib.h>
#define N 120001
int n, q, pp[N], jj[N], dd[N], up[N], temp, inc[N];
int *eh[N], *fh[N], eo[N];
void pus_(int **eh, int *eo, int i, int j) {
int o = eo[i]++;
if (0 == o) eh[i] = (int*)malloc(2 * sizeof **eh);
else if (0 == (o & o - 1)) eh[i] = (int*)realloc(eh[i], 2 * o * sizeof **eh);
eh[i][o] = j;
}
void link(int u, int v, int w) {
pus_(eh, eo, u, v);
--eo[u];
pus_(fh, eo, u, v);
pus_(eh, eo, v, u);
--eo[v];
pus_(fh, eo, v, u);
}
void dfs(int u, int p) {
dd[u] = dd[pp[u] = p] + 1;
inc[u] = (up[u] > up[p]) + inc[p];
for (int j = 0; j < eo[u]; ++j) if (eh[u][j] != p) {
up[eh[u][j]] = fh[u][j];
dfs(eh[u][j], u);
}
}
int lca(int u, int v) {
while (dd[u] != dd[v]) {
if (dd[u] < dd[v]) temp = u, u = v, v = temp;
u = (dd[jj[u]] >= dd[v]) ? jj[u] : pp[u];
}
while (u != v)
if (jj[u] != jj[v]) u = jj[u], v = jj[v];
else u = pp[u], v = pp[v];
return u;
}
int anc(int u, int dep) {
while (dd[u] > dep)
if (dd[jj[u]] >= dep) u = jj[u];
else u = pp[u];
return u;
}
struct Query {
char type;
int a, b;
int ans;
} qq[N];
int query_yesno_(int u, int v) {
if (dd[u] > dd[v]) temp = u, u = v, v = temp;
int a = lca(u, v);
int va = anc(v, dd[a] + 1);
if (u == a)
return inc[v] - inc[va] == 0 || inc[v] - inc[va] == dd[u] - dd[a] - 1;
int ua = anc(u, dd[a] + 1);
return (dd[u] - dd[a] == inc[u] - inc[ua] + 1) && (0 == inc[v] - inc[va])
&& up[ua] < up[va];
}
int query_yesno(int u, int v) {
return query_yesno_(u, v) || query_yesno_(v, u);
}
int main() {
scanf("%d%d", &n, &q);
for (int j = 0, i = 0; i < q; ++i) {
char c;
int a, b;
scanf(" %c%d", &c, &a);
if (c == 'S') {
scanf("%d", &b);
link(a, b, j++);
} else if (c == 'Q') {
scanf("%d", &b);
} else {
}
qq[i] = (Query){c, a, b};
}
jj[1] = 1;
dfs(1, 1);
for (int i = 0; i < q; ++i) {
if (qq[i].type == 'Q') {
puts(query_yesno(qq[i].a, qq[i].b) ? "YES": "NO");
}
}
}
Compilation message
servers.c: In function 'pus_':
servers.c:13:26: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
13 | else if (0 == (o & o - 1)) eh[i] = (int*)realloc(eh[i], 2 * o * sizeof **eh);
| ~~^~~
servers.c: In function 'main':
servers.c:92:18: error: 'Query' undeclared (first use in this function)
92 | qq[i] = (Query){c, a, b};
| ^~~~~
servers.c:92:18: note: each undeclared identifier is reported only once for each function it appears in
servers.c:92:24: error: expected ';' before '{' token
92 | qq[i] = (Query){c, a, b};
| ^
| ;
servers.c:78:5: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
78 | scanf("%d%d", &n, &q);
| ^~~~~~~~~~~~~~~~~~~~~
servers.c:83:9: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
83 | scanf(" %c%d", &c, &a);
| ^~~~~~~~~~~~~~~~~~~~~~
servers.c:85:13: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
85 | scanf("%d", &b);
| ^~~~~~~~~~~~~~~
servers.c:88:13: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
88 | scanf("%d", &b);
| ^~~~~~~~~~~~~~~