Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # include <bits/stdc++.h>
- # define sz(s) int(s.size())
- # define IoS ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL);
- using namespace std;
- long long timber;
- long long arr[200200];
- int fir[100100], hrr[100100], tree[4004000];
- vector< int > vrr[100100], order, bur;
- void way(int v, int p = -1, int h = 0)
- {
- order.push_back(v);
- hrr[v] = h;
- if(fir[v] == -1) fir[v] = sz(order) - 1;
- for(int x : vrr[v]){
- if(x != p){
- way(x, v, h + 1);
- order.push_back(v);
- }
- }
- }
- void build_t(int v, int tl, int tr)
- {
- ///cout << " v = " << v << " tl = " << tl << " tr = " << tr << '\n';
- int a;
- ///cin >>a;
- if(tl == tr) tree[v] = order[tl];
- else {
- int tm = ((tl + tr) >> 1);
- build_t((v << 1), tl, tm);
- build_t((v << 1) + 1, tm + 1, tr);
- if(hrr[tree[(v << 1)]] < hrr[tree[(v << 1) + 1]]) tree[v] = tree[(v << 1)];
- else tree[v] = tree[(v << 1) + 1];
- }
- }
- int get_mn(int v, int tl, int tr, int le, int ri)
- {
- if((tr < le) || (ri < tl)) return 100000000;
- else if((le <= tl) && (tr <= ri)) return tree[v];
- else {
- int tm = ((tl + tr) >> 1), a, b;
- a = get_mn((v << 1), tl, tm, le, ri);
- b = get_mn((v << 1) + 1, tm + 1, tr, le, ri);
- if(a == 100000000) return b;
- else {
- if(b == 100000000) return a;
- else {
- if(hrr[a] < hrr[b]) return a;
- return b;
- }
- }
- }
- }
- int main()
- {
- long long n, m, p, K, v, s, x, y, z;
- cin >> n >> m;
- for(int i = 1; i < n; i++){
- cin >> p;
- fir[i] = fir[i - 1] = -1;
- vrr[i].push_back(p);
- vrr[p].push_back(i);
- }
- cin >> arr[1] >> arr[2] >> x >> y >> z;
- for(long long i = 3, M = 2 * m; i <= M; i++){
- arr[i] = ((arr[i - 2] * x) + (arr[i - 1] * y) + z) % n;
- }
- way(0);
- ///cout << " F 1 " << '\n';
- K = sz(order) - 1;
- ///cout << " F 2 " << '\n';
- build_t(1, 0, K);
- ///cout << " F 3" << '\n';
- v = get_mn(1, 0, K, min(fir[arr[1]], fir[arr[2]]), max(fir[arr[1]], fir[arr[2]]));
- ///cout << " v = " << v << '\n';
- s = v;
- for(int i = 2; i <= m; i++){
- long long a = (arr[(2 * i) - 1] + v) % n, b = arr[2 * i];
- if(fir[a] > fir[b]) swap(a, b);
- cout << " a = " << a << " b = " << b << '\n';
- v = get_mn(1, 0, K, fir[a], fir[b]);
- s += v;
- }
- cout << s;
- return 0;
- }
- /**
- 1 2 3 4 5 6 7 8 9 10
- 1 2 7 6 5 4 3 8 9 10
- 08.04.2017 ( ) - 0166
- 10.04.2017 ( ) - 0027
- 11.04.2017 ( ) - 0672
- 12.04.2017 ( ) - 0174
- 13.04.2017 ( ) - 0602
- 17.04.2017 ( ) - 0570
- 18.04.2017 ( ) - 0310
- ?
- 0080
- ??
- 0057
- 0412
- 0174
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement