Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <bits/stdc++.h>
- using namespace std;
- int n, m;
- long long h[200000];
- long long t[800100];
- void build (int v, int tl, int tr)
- {
- if (tl == tr)
- {
- t[v] = h[tl];
- }
- else
- {
- int tm = (tl + tr) / 2;
- build (2 * v, tl, tm);
- build (2 * v + 1, tm + 1, tr);
- t[v] = max (t[2 * v], t[2 * v + 1]);
- }
- }
- long long Max (int v, int tl, int tr, int l, int r)
- {
- if (l <= tl && tr <= r)
- {
- return t[v];
- }
- if (l > tr || tl > r)
- {
- return INT_MIN;
- }
- int tm = (tl + tr) / 2;
- return max(Max(2 * v, tl, tm, l, r), Max(2 * v + 1, tm + 1, tr, l, r))
- }
- int main()
- {
- // freopen ("mushrooms.in", "r", stdin);
- // freopen ("mushrooms.out", "w", stdout);
- cin >> n;
- for (int i = 0; i < n; i++)
- {
- int a ;
- scanf ("%d", &a);
- h[i] = a;
- }
- build (1, 0, n - 1);
- long long ans = 0;
- cin >> m;
- int l, r;
- int H = Max (1, 0 , n - 1, l, r);
- ans += H;
- for (int i = 0; i < m - 1; i++)
- {
- int ll = min(r, ((l * H + H * H) % n));
- int rr = max(r, ((l * H + H * H) % n));
- l = ll;
- r = rr;
- H = Max (1, 0, n - 1, l, r);
- ans += H;
- }
- cout << ans;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement