제출 #868433

#제출 시각아이디문제언어결과실행 시간메모리
868433Nuraly_SerikbayBirthday gift (IZhO18_treearray)C++14
0 / 100
7 ms29368 KiB
//Bismillahir-Rahmanir-Rahim #include <bits/stdc++.h> using namespace std; #define flash ios_base::sync_with_stdio(0),cin.tie(0) #define pb push_back #define ll long long #define ld long double #define dbg(x) cerr << #x << " = " << x << "\n"; #define ff first #define ss second /* #pragma GCC target ("avx2") #pragma GCC optimization ("O3") #pragma comment (linker, "/stack:200000000") #pragma GCC optimize("Ofast") #pragma GCC target ("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") */ const long long INF = 1e9 + 7; const long long MOD = 1e9 + 7; const int maxn = 2e5 + 10; const int lg = 22; int n, m, q, a[maxn], upp[maxn][lg + 1], tin[maxn], tout[maxn], timer; vector <int> g[maxn]; set <int> s[maxn]; set <int> s2[maxn]; void dfs(int v, int p) { upp[v][0] = p; tin[v] = ++timer; for (int i = 1; i <= lg; i++) { upp[v][i] = upp[upp[v][i - 1]][i - 1]; } for (auto to: g[v]) { if (to != p) { dfs(to, v); } } tout[v] = timer; } bool check(int a, int b) { if (tin[a] <= tin[b] && tout[a] >= tout[b]) { return 1; } return 0; } int lca(int a, int b) { if (check(a, b)) { return a; } if (check(b, a)) { return b; } for (int i = lg; i >= 0; i--) { if (!check(upp[a][i], b) && upp[a][i] != 0) { a = upp[a][i]; } } return upp[a][0]; } void press_F_() { cin >> n >> m >> q; for (int i = 1; i < n; i++) { int x, y; cin >> x >> y; g[x].pb(y); g[y].pb(x); } for (int i = 1; i <= m; i++) { cin >> a[i]; } dfs(1, 0); for (int i = 1; i <= n; i++) { s[a[i]].insert(i); } for (int i = 1; i < n; i++) { s2[lca(a[i], a[i + 1])].insert(i); } while(q--) { int tp; cin >> tp; if (tp == 1) { int pos, x; cin >> pos >> x; s[a[pos]].erase(pos); if (pos < n) { s2[lca(a[pos], a[pos + 1])].erase(pos); } if (pos > 1) { s2[lca(a[pos - 1], a[pos])].erase(pos - 1); } a[pos] = x; s[a[pos]].insert(pos); if (pos < n) { s2[lca(a[pos], a[pos + 1])].insert(pos); } if (pos > 1) { s2[lca(a[pos - 1], a[pos])].insert(pos - 1); } } else { int l, r, x; cin >> l >> r >> x; if (s[x].lower_bound(l) != s[x].end() && (*s[x].lower_bound(l)) <= r) { int p = (*s[x].lower_bound(l)); cout << p << " " << p << '\n'; continue; } if (s2[x].lower_bound(l) != s2[x].end() && (*s2[x].lower_bound(l)) < r) { int p = (*s2[x].lower_bound(l)); cout << p << " " << p + 1 << '\n'; continue; } cout << -1 << " " << -1 << '\n'; } } } /* 5 4 4 1 2 3 1 3 4 5 3 4 5 2 3 2 1 3 1 1 3 5 2 3 4 5 2 1 3 1 */ int main() { flash; // srand(time(0)); int T = 1; // cin >> T; for (int i = 1; i <= T; i++) { // cout << "Case" << " " << i << ':' << "\n"; press_F_(); } //Respa gold 2023-2024 InshAllah return 0; } /* Maybe not today and tomorrow, but InshAllah one day I will reach expert */ // g++ -std=c++17 main.cpp // ./a.out
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...