Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define forn(i, n) for (int i = 0; i < n; ++i)
- #define debug(...) fprintf(stderr, __VA_ARGS__), fflush(stderr)
- #define pb push_back
- const int N = 100010;
- const int INF = 1000000000;
- typedef long long ll;
- int tin[N], tout[N];
- vector<int> g[N];
- int d[N];
- vector<int> ord;
- int first[N];
- int sp[20][N];
- int lg[2 * N];
- void dfs(int v)
- {
- first[v] = ord.size();
- ord.pb(v);
- for (int to: g[v])
- {
- d[to] = d[v] + 1;
- dfs(to);
- ord.pb(v);
- }
- }
- int getMin(int a, int b)
- {
- if (a > b)
- swap(a, b);
- int len = b - a + 1;
- int k = lg[len];
- int ans = sp[k][b - (1 << k) + 1];
- if (d[ans] > d[sp[k][a]])
- ans = d[sp[k][a]];
- return ans;
- }
- int main()
- {
- ios_base::sync_with_stdio(0);
- cin.tie(false);
- cout.tie(false);
- lg[1] = 0;
- for (int i = 2, e = 2 * N; i < e; ++i)
- lg[i] = lg[i >> 1] + 1;
- int n, m;
- cin >> n >> m;
- for (int i = 1; i < n; ++i)
- {
- int p;
- cin >> p;
- g[p].pb(i);
- }
- dfs(0);
- forn (i, ord.size())
- sp[0][i] = ord[i];
- for (int i = 1; i <= lg[ord.size()]; ++i)
- for (int j = 0; j + (1 << (i - 1)) < ord.size(); ++j)
- {
- sp[i][j] = sp[i - 1][j + (1 << (i - 1))];
- if (d[sp[i][j]] > d[sp[i - 1][j]])
- d[sp[i][j]] = d[sp[i - 1][j]];
- }
- int a, b, x, y, z;
- cin >> a >> b >> x >> y >> z;
- ll res = 0;
- forn (i, m)
- {
- int v = getMin(first[a], first[b]);
- res += v;
- a = (x * a + y * b + z) % n;
- b = (x * b + y * a + z) % n;
- a = (a + v) % n;
- }
- cout << res;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement