Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include<vector>
- #include<algorithm>
- #include<math.h>
- #include<set>
- #include<string>
- #pragma GCC optimize("Ofast")
- #pragma GCC optimize("unroll-loops")
- #include <cassert>
- using namespace std;
- #define int long long
- typedef long long lli;
- typedef long double ld;
- //const double E = 0.0000001;
- const int INF = 1e7;
- #define forn(i, s, f) for (int i = s; i < f; ++i)
- #define ft first
- #define sec second
- #define fora(i, n) for (auto i : n)
- #define sz(a) (int)(a).size()
- #define sort_(a) sort(a.begin(), a.end())
- #define pb push_back
- #define mp make_pair
- #define fast_ cin.tie(0), ios_base::sync_with_stdio(false)
- int con = 30;
- vector<vector<int>> g;
- vector<int> pr, tin, tout, dis;
- int timer = 0;
- void dfs(int v, int h) {
- dis[v] = h;
- tin[v] = timer;
- timer++;
- fora(u, g[v]) {
- dfs(u, h + 1);
- }
- tout[v] = timer;
- timer++;
- }
- bool pre(int v, int u) {
- return tin[v] <= tin[u] && tout[u] <= tout[v];
- }
- int lca(int v, int u, vector<vector<int>>& lca_) {
- if (pre(v, u)) {
- return v;
- }
- if (pre(u, v)) {
- return u;
- }
- for (int i = con - 1; i >= 0; i--) {
- if (!pre(lca_[i][v], u)) {
- v = lca_[i][v];
- }
- }
- return lca_[0][v];
- }
- signed main()
- {
- fast_;
- int n;
- cin >> n;
- n++;
- //vector<int> ar(n);
- g.resize(n);
- tin.resize(n);
- tout.resize(n);
- dis.resize(n);
- vector<vector<int>> lca_(con, vector<int>(n, 0));
- pr.resize(n);
- forn(i, 1, n) {
- int a;
- cin >> a;
- a--;
- g[a].pb(i);
- pr[i] = a;
- lca_[0][i] = a;
- }
- forn(i, 1, con) {
- forn(j, 0, n) {
- lca_[i][j] = lca_[i - 1][lca_[i - 1][j]];
- }
- }
- dfs(0, 0);
- int v = 0, u = 0, an = 0;
- forn(i, 1, n) {
- //cout << dis[i] << endl;
- int cu = dis[i] + dis[v] - dis[lca(i, v, lca_)];
- int cu2 = dis[i] + dis[u] - dis[lca(i, u, lca_)];
- if (cu > cu2) {
- if (cu >= an) {
- an = cu;
- u = i;
- }
- }
- else {
- if (cu2 >= an) {
- an = cu2;
- v = i;
- }
- }
- cout << an << "\n";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement