Advertisement
Guest User

Kodekode

a guest
May 1st, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.83 KB | None | 0 0
  1. # include <bits/stdc++.h>
  2. # define sz(s) int(s.size())
  3. # define IoS ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL);
  4.   using namespace std;
  5.   long long timber;
  6.   long long arr[200200];
  7.   int fir[100100], hrr[100100], tree[4004000];
  8.   vector< int > vrr[100100], order, bur;
  9.   void way(int v, int p = -1, int h = 0)
  10.   {
  11.       order.push_back(v);
  12.       hrr[v] = h;
  13.       if(fir[v] == -1) fir[v] = sz(order) - 1;
  14.       for(int x : vrr[v]){
  15.         if(x != p){
  16.             way(x, v, h + 1);
  17.             order.push_back(v);
  18.         }
  19.       }
  20.   }
  21.   void build_t(int v, int tl, int tr)
  22.   {
  23.       ///cout << " v = " << v << " tl = " << tl << " tr = " << tr << '\n';
  24.       int a;
  25.       ///cin >>a;
  26.       if(tl == tr) tree[v] = order[tl];
  27.       else {
  28.         int tm = ((tl + tr) >> 1);
  29.         build_t((v << 1), tl, tm);
  30.         build_t((v << 1) + 1, tm + 1, tr);
  31.         if(hrr[tree[(v << 1)]] < hrr[tree[(v << 1) + 1]]) tree[v] = tree[(v << 1)];
  32.         else tree[v] = tree[(v << 1) + 1];
  33.       }
  34.   }
  35.   int get_mn(int v, int tl, int tr, int le, int ri)
  36.   {
  37.       if((tr < le) || (ri < tl)) return 100000000;
  38.       else if((le <= tl) && (tr <= ri)) return tree[v];
  39.       else {
  40.         int tm = ((tl + tr) >> 1), a, b;
  41.         a = get_mn((v << 1), tl, tm, le, ri);
  42.         b = get_mn((v << 1) + 1, tm + 1, tr, le, ri);
  43.         if(a == 100000000) return b;
  44.         else {
  45.             if(b == 100000000) return a;
  46.             else {
  47.                 if(hrr[a] < hrr[b]) return a;
  48.                 return b;
  49.             }
  50.         }
  51.       }
  52.   }
  53.   int main()
  54.   {
  55.       long long n, m, p, K, v, s, x, y, z;
  56.       cin >> n >> m;
  57.       for(int i = 1; i < n; i++){
  58.         cin >> p;
  59.         fir[i] = fir[i - 1] = -1;
  60.         vrr[i].push_back(p);
  61.         vrr[p].push_back(i);
  62.       }
  63.       cin >> arr[1] >> arr[2] >> x >> y >> z;
  64.       for(long long i = 3, M = 2 * m; i <= M; i++){
  65.         arr[i] = ((arr[i - 2] * x) + (arr[i - 1] * y) + z) % n;
  66.       }
  67.       way(0);
  68.       ///cout << " F 1 " << '\n';
  69.       K = sz(order) - 1;
  70.       ///cout << " F 2 " << '\n';
  71.       build_t(1, 0, K);
  72.       ///cout << " F 3" << '\n';
  73.       v = get_mn(1, 0, K, min(fir[arr[1]], fir[arr[2]]), max(fir[arr[1]], fir[arr[2]]));
  74.       ///cout << " v = " << v << '\n';
  75.       s = v;
  76.       for(int i = 2; i <= m; i++){
  77.         long long a = (arr[(2 * i) - 1] + v) % n, b = arr[2 * i];
  78.         if(fir[a] > fir[b]) swap(a, b);
  79.         cout << " a = " << a << " b = " << b << '\n';
  80.         v = get_mn(1, 0, K, fir[a], fir[b]);
  81.         s += v;
  82.       }
  83.       cout << s;
  84.       return 0;
  85.   }
  86. /**
  87. 1 2 3 4 5 6 7 8 9 10
  88. 1 2 7 6 5 4 3 8 9 10
  89.  
  90.  
  91.  
  92.  
  93. 08.04.2017 ( ) - 0166
  94. 10.04.2017 ( ) - 0027
  95. 11.04.2017 ( ) - 0672
  96. 12.04.2017 ( ) - 0174
  97. 13.04.2017 ( ) - 0602
  98. 17.04.2017 ( ) - 0570
  99. 18.04.2017 ( ) - 0310
  100.  
  101. ?
  102. 0080
  103.  
  104. ??
  105. 0057
  106. 0412
  107.  
  108. 0174
  109.  
  110.  
  111.  
  112. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement