Submission #934166

#TimeUsernameProblemLanguageResultExecution timeMemory
934166Joshua_AnderssonInside information (BOI21_servers)C++14
20 / 100
3562 ms118684 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define int ll const int inf = int(1e18); typedef vector<int> vi; typedef vector<vi> vvi; typedef pair<int, int> p2; #define rep(i, high) for (int i = 0; i < high; i++) #define repp(i, low, high) for (int i = low; i < high; i++) #define repe(i, container) for (auto& i : container) #define sz(container) ((int)container.size()) #define all(x) begin(x),end(x) #define ceildiv(x,y) ((x + y - 1) / (y)) inline void fast() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); } #define _LOCAL _DEBUG #if _LOCAL #define assert(x) if (!(x)) __debugbreak() #endif const int maxn = int(1.5e5); int tin[maxn]; int tout[maxn]; int timer = 0; int up[18][maxn]; int upincreasing[18][maxn]; int updecreasing[18][maxn]; int upmax[18][maxn]; int upv[maxn]; void dfs(int u, int p, int p1, int _p2, vector<vector<p2>>& edges) { tin[u] = timer++; up[0][u] = p; upmax[0][u] = upv[u]; upincreasing[0][u] = upmax[0][u] < upmax[0][p] || p==0; updecreasing[0][u] = upmax[0][u] > upmax[0][p] || p==0 || u==0; repp(d,1,18) { int mid = up[d - 1][u]; up[d][u] = up[d - 1][mid]; upmax[d][u] = max(upmax[d - 1][u], upmax[d - 1][mid]); upincreasing[d][u] = upincreasing[d - 1][u] && upincreasing[d-1][mid] && (upmax[0][mid] < upmax[0][up[0][mid]]); updecreasing[d][u] = updecreasing[d - 1][u] && updecreasing[d-1][mid] && (upmax[0][mid] > upmax[0][up[0][mid]] || up[0][mid]==0||mid==0); } repe(e, edges[u]) if (e.first != p) { upv[e.first] = e.second; dfs(e.first, u, p1, _p2, edges); } tout[u] = timer++; } bool isancestor(int a, int b) { return tin[a] <= tin[b] && tout[a] >= tout[b]; } int pathmax(int a, int b) { if (isancestor(a, b)) return -1; int ret = -1; for (int d = 17; d >= 0; d--) { if (!isancestor(up[d][a], b)) { ret = max(ret, upmax[d][a]); a = up[d][a]; } } return max(ret, upmax[0][a]); } signed main() { fast(); //ifstream in("C:\\Users\\Matis\\desktop\\comp_prog\\x64\\debug\\in.txt"); //cin.rdbuf(in.rdbuf()); int n, q; cin >> n >> q; vvi queries; int t = 0; vector<vector<p2>> edges(n); rep(i, n + q - 1) { char c; cin >> c; if (c=='S') { int a, b; cin >> a >> b; a--; b--; edges[a].emplace_back(b, t); edges[b].emplace_back(a, t); t++; } else if (c=='Q') { int a, b; cin >> a >> b; a--; b--; queries.push_back({ 0, b, a, t-1 }); } else { int c; cin >> c; c--; queries.push_back({ 1, c, -1, t-1 }); } } dfs(0, 0, -1, -1, edges); auto getmax = [&](int a, int b) { return max(pathmax(a, b), pathmax(b, a)); }; auto pathgood = [&](int a, int b, int t) { if (getmax(a, b) > t) return false; // all edges <= t // from b->lca increasing // from a->lca decreasing bool good = 1; int u = b; int prev = inf; for (int d = 17; d >= 0; d--) { if (!isancestor(up[d][u],a)) { good &= updecreasing[d][u]; u = up[d][u]; } } if (!isancestor(u,a)) { prev = upmax[0][u]; } /*bool g = 1; int p = inf; while (!isancestor(u, a)) { g &= upv[u] < p; p = upv[u]; u = up[0][u]; }*/ //assert(prev == p); //assert(g == good); u = a; int v = -1; while (!isancestor(u, b)) { good &= upv[u] > v; v = upv[u]; u = up[0][u]; } return good && (v < prev); }; repe(q, queries) { int type=q[0], a=q[1], b=q[2], t=q[3]; if (type==0) { cout << (pathgood(a, b, t) ? "yes" : "no") << "\n"; } } return 0; }
#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...