Submission #157057

#TimeUsernameProblemLanguageResultExecution timeMemory
157057dandrozavrBirthday gift (IZhO18_treearray)C++14
100 / 100
1243 ms77788 KiB
/* Uruchamiamy samolot zwiadowczy ( + 500% do wzlamaniej ) /▄/ /█/ /&#9680;/ /▐/ /▌/ /▀/ /░/ /&#128293;/ choose own style! ***IT'S OUR LONG WAY TO THE OIILLLL*** ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░████████░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░█████████░░░░░░░░░░░░░░░░░▌░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░◐◐◐█████████▀▀▀▀▀▀🔥░░░░░░░░███░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░█████████░░░░░░░░░░░░░░░░░░░░▌░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░█████████░░░░░░░░░░░░░░░░░░░░█▌░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▄▄▀██████████████████████████████████████████████████ ░░░░░░░░░░░░░░░░░░░░░░░░░░▄▄▄████▄████████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ █████ ░░░░░░░░░░░░░░░░░░░░░░░░░░░▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█████████▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░█████████░░░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░◐◐◐█████████▀▀▀▀▀▀🔥░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░█████████░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░█████████░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░████████░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░███████░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░██████░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░█████░░░░░░░░░░░░░░░ */ //#pragma GCC optimize("Ofast") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4") //#pragma comment(linker, "/stack:200000000") #include <bits/stdc++.h> using namespace std; #define pb push_back #define ll long long #define ld long double #define fi first #define se second #define eb emplace_back #define pii pair < int , int > #define pipii pair< int, pair < int , int > > #define TIME clock() * 1.0 / CLOCKS_PER_SEC mt19937 gen(chrono::high_resolution_clock::now().time_since_epoch().count()); //#include <ext/pb_ds/detail/standard_policies.hpp>' //#include <ext/pb_ds/assoc_container.hpp> //#include <ext/pb_ds/tree_policy.hpp> //using namespace __gnu_pbds;template <typename T> using ordered_set = tree <T, null_type, less< T >, rb_tree_tag,tree_order_statistics_node_update>; namespace fastio {template <class T> ostream &operator<<(ostream &os, const vector<T> &container){for (auto &u : container)os << u << " ";return os;}template<class T1, class T2> ostream& operator << (ostream& os, const pair<T1, T2>& p) { return os << p.first << " " << p.second; }template <class T> ostream &operator<<(ostream &os, set<T> const& con) { for (auto &u : con) os << u << " "; return os; }void pr() {}template <typename T, typename... args> void pr(T x, args... tail) { cout << x << " "; pr(tail...);}}using namespace fastio; const int N = 3e5 + 5; const int MA = 1e6 + 1; const int X[4] = {0, 0, 1, -1}; const int Y[4] = {-1, 1, 0, 0}; vector < int > g[N]; int up[N][18], tin[N], tout[N], timer; void dfs(int v, int pr = 0) { tin[v] = ++timer; up[v][0] = pr; for (int i = 1; i < 18; ++i) up[v][i] = up[up[v][i - 1]][i - 1]; for (int to : g[v]) if (to != pr) { dfs(to, v); } tout[v] = ++timer; } bool upper(int x, int y) { return (tin[x] <= tin[y] && tout[x] >= tout[y]); } int LCA(int x, int y) { if (upper(x, y)) return x; if (upper(y, x)) return y; for (int i = 17; i >= 0; --i) if (!upper(up[x][i], y)) x = up[x][i]; return up[x][0]; } int main() { ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); #ifdef Estb_probitie freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif int n, m, q; cin >> n >> m >> q; for (int i = 1; i < n; ++i) { int x, y; cin >> x >> y; --x, --y; g[x].pb(y); g[y].pb(x); } dfs(0); int a[m]; for (int i = 0; i < m; ++i) cin >> a[i], a[i]--; set < int > ver[n], pai[n]; for (int i = 0; i < m; ++i) { ver[a[i]].insert(i); if (i) pai[LCA(a[i], a[i - 1])].insert(i - 1); } while(q--) { int ty; cin >> ty; if (ty == 1) { int pos, v; cin >> pos >> v; --pos;--v; ver[a[pos]].erase(pos); if (pos) pai[LCA(a[pos], a[pos - 1])].erase(pos - 1); if (pos + 1 < m) pai[LCA(a[pos], a[pos + 1])].erase(pos); a[pos] = v; ver[v].insert(pos); if (pos) pai[LCA(v, a[pos - 1])].insert(pos - 1); if (pos + 1 < m) pai[LCA(v, a[pos + 1])].insert(pos); continue; } int l, r, v; cin >> l >> r >> v; --l;--r;--v; int f = -2, s = -2; auto pp = ver[v].lower_bound(l); if (pp != ver[v].end() && (*pp) <= r) { f = s = (*pp); } else { auto poz = pai[v].lower_bound(l); if (poz != pai[v].end() && (*poz) < r) f = (*poz), s = (*poz) + 1; } cout << f + 1 << " " << s + 1 << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...