Advertisement
Guest User

Horses

a guest
Jun 24th, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.61 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include "horses.h"
  3.  
  4. using namespace std;
  5.  
  6. typedef long long llint;
  7. typedef set <int> :: iterator iter;
  8.  
  9. const int MAXN = 500005;
  10. const int INF = 1000000000;
  11. const int MOD = 1000000007;
  12.  
  13. int n, ofs = 1;
  14. llint x[MAXN], y[MAXN];
  15. int t[4*MAXN];
  16. set <int> st;
  17. vector < pair <int, int> > v;
  18. llint fen[MAXN];
  19.  
  20. void ubaci (int xx, llint val) {
  21.     xx++;
  22.     for (; xx < MAXN; xx += xx&-xx) {
  23.         fen[xx] = (fen[xx] * val) % MOD;
  24.     }
  25. }
  26.  
  27. llint get (int ind) {
  28.     llint res = 1;
  29.     ind++;
  30.     for (; ind > 0; ind -= ind&-ind) res = (res * fen[ind]) % MOD;
  31.     return res;
  32. }
  33.  
  34. void build () {
  35.     while (ofs < n) ofs *= 2;
  36.     for (int i=0; i<n; i++) {
  37.         t[i + ofs] = y[i];
  38.     }
  39.     for (int i = ofs-1; i>0; i--) {
  40.         t[i] = max(t[2*i], t[2*i+1]);
  41.     }
  42. }
  43.  
  44. int upit (int xx, int from, int to, int low, int high) {
  45.     if (from <= low && high <= to) return t[xx];
  46.     if (to < low || high < from) return 0;
  47.     return max(upit(xx*2, from, to, low, (low + high)/2), upit(xx*2+1, from, to, (low + high)/2 + 1, high));
  48. }
  49.  
  50. void update (int pos, int val) {
  51.     pos += ofs;
  52.     t[pos] = val;
  53.     pos /= 2;
  54.     while (pos > 0) {
  55.         t[pos] = max(t[pos*2], t[pos*2+1]);
  56.         pos /= 2;
  57.     }
  58. }
  59.  
  60. llint calc () {
  61.     __int128 mx = 0, curr = 1, pos = 0, mxy = 1;
  62.     for (int i=(int)v.size()-1; i>=0; i--) {
  63.         int ind = v[i].first, yi = v[i].second;
  64.         curr *= x[ind];
  65.         if (curr * yi > mx) {
  66.             mx = curr * yi;
  67.             mxy = yi;
  68.             pos = ind;
  69.         }
  70.     }
  71.     return get(pos) * mxy % MOD;
  72. }
  73.  
  74. llint rjesi () {
  75.     v.clear();
  76.     if (st.empty()) {
  77.         v.push_back(make_pair(0, t[1]));
  78.     } else {
  79.         llint p = 1;
  80.         iter it = st.end(); it--;
  81.         int prosli = n;
  82.         while (1) {
  83.             int ind = *it;
  84.             p *= x[ind];
  85.             v.push_back(make_pair(ind, upit(1, ind, prosli-1, 0, ofs-1)));
  86.             prosli = ind;
  87.             if (p > INF || it == st.begin()) break;
  88.             it--;
  89.         }
  90.         if (p <= INF && prosli != 0) {
  91.             v.push_back(make_pair(0, upit(1, 0, prosli-1, 0, ofs-1)));
  92.         }
  93.     }
  94.     return calc();
  95. }
  96.  
  97. int init (int N, int X[], int Y[]) {
  98.     n = N;
  99.     for (int i=0; i<MAXN; i++) {
  100.         fen[i] = 1;
  101.     }
  102.     for (int i=0; i<n; i++) {
  103.         x[i] = X[i]; y[i] = Y[i];
  104.         if (x[i] != 1) st.insert(i);
  105.         ubaci(i, x[i]);
  106.     }
  107.     build();
  108.     return rjesi();
  109. }
  110.  
  111. llint pot (llint b, llint e) {
  112.     if (e == 0) return 1;
  113.     if (e & 1) {
  114.         return pot(b, e-1) * b % MOD;
  115.     } else {
  116.         llint t = pot(b, e / 2);
  117.         return t * t % MOD;
  118.     }
  119. }
  120.  
  121. int updateX(int pos, int val) {
  122.     llint inv = pot(x[pos], MOD-2);
  123.     ubaci(pos, inv);
  124.     if (x[pos] != 1) st.erase(pos);
  125.     x[pos] = val;
  126.     ubaci(pos, val);
  127.     if (x[pos] != 1) st.insert(pos);
  128.     return rjesi();
  129. }
  130.  
  131. int updateY(int pos, int val) {
  132.     update(pos, val);
  133.     return rjesi();
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement