Submission #1195619

#TimeUsernameProblemLanguageResultExecution timeMemory
1195619anmattroiInside information (BOI21_servers)C++17
48 / 100
132 ms35400 KiB
#include <bits/stdc++.h>
#define maxn 120005
#define fi first
#define se second
using namespace std;
using ii = pair<int, int>;

const int INF = 1'000'000'000;

int n, k;
vector<ii> adj[maxn];

struct query {
    char type; int u, v;
    query() {}
} queries[maxn+maxn];

int pe[maxn], d[maxn], f[17][maxn], g[17][maxn];

int ASC[maxn], DESC[maxn];

int jump(int x, int k) {
    for (int i = 0; i < 17; i++) if (k>>i&1) x = f[i][x];
    return x;
}

int LCA(int u, int v) {
    if (d[u] > d[v]) swap(u, v);
    if (d[u] < d[v]) v = jump(v, d[v]-d[u]);
    if (u == v) return u;
    for (int i = 16; i >= 0; i--)
    if (f[i][u] != f[i][v]) {
        u = f[i][u];
        v = f[i][v];
    }
    return f[0][u];
}

void pfs(int u, int dad) {
    f[0][u] = dad; g[0][u] = pe[u];
    for (int i = 1; i < 17; i++) {
        f[i][u] = f[i-1][f[i-1][u]];
        g[i][u] = max(g[i-1][u], g[i-1][f[i-1][u]]);
    }
    ASC[u] = (pe[u] < pe[dad] ? ASC[dad] : dad);
    DESC[u] = (pe[u] > pe[dad] ? DESC[dad] : dad);

    for (auto [v, l] : adj[u])
    if (v != dad) {
        pe[v] = l;
        d[v] = d[u]+1;
        pfs(v, u);
    }
}

int ASCENSION(int u, int w) {
    return d[ASC[u]] <= d[w];
}

int DECENSION(int u, int w) {
    return d[DESC[u]] <= d[w];
}

int MAXIMUS(int u, int v, int w, int TIME) {
    int k, ans = 0;
    k = d[u]-d[w];
    for (int i = 0; i < 17; i++) if (k>>i&1) {
        ans = max(ans, g[i][u]);
        u = f[i][u];
    }
    k = d[v]-d[w];
    for (int i = 0; i < 17; i++) if (k>>i&1) {
        ans = max(ans, g[i][v]);
        v = f[i][v];
    }
    return ans < TIME;
}

void queryQ(int u, int v, int TIME) {
    swap(u, v);
    int w = LCA(u, v);
    int condition = 1;
    condition &= ASCENSION(u, w);
    condition &= DECENSION(v, w);
    if (w != u && w != v) condition &= (pe[jump(u, d[u]-d[w]-1)] < pe[jump(v, d[v]-d[w]-1)]);
    condition &= MAXIMUS(u, v, w, TIME);
    cout << (condition ? "yes\n" : "no\n");
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> n >> k;
    for (int i = 1; i < n+k; i++) {
        cin >> queries[i].type >> queries[i].u;
        if (queries[i].type != 'C') cin >> queries[i].v;
        if (queries[i].type == 'S') {
            adj[queries[i].u].emplace_back(queries[i].v, i);
            adj[queries[i].v].emplace_back(queries[i].u, i);
        }
    }

    pfs(1, 0);

    for (int i = 1; i < n+k; i++)
        if (queries[i].type == 'Q') queryQ(queries[i].u, queries[i].v, i);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...