available3124

H

Jan 16th, 2023
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.69 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. //#include <ext/pb_ds/assoc_container.hpp>
  3.  
  4. //using namespace __gnu_pbds;
  5. using namespace std;
  6.  
  7. //template<typename T>
  8. //using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  9.  
  10. //#pragma GCC optimize("O3,unroll-loops")
  11. //#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
  12.  
  13. typedef long long ll;
  14.  
  15. #define pw(x) (1ll << x)
  16. #define all(x) (x).begin(), (x).end()
  17. #define mt(x) (x << 1ll)
  18. #define sz(x) (int)(x).size()
  19. #define sqr(x) (x) * (x)
  20.  
  21. const int mod = 1e9 + 7;
  22. const int inf = 1e9;
  23. const ll linf = 1e18;
  24.  
  25. const int maxn = 2e5 + 1;
  26. const int lg = 20;
  27.  
  28. int n, m, a[maxn], st[maxn][lg];
  29. int suff[maxn];
  30.  
  31. int get(int l, int r) {
  32.     int j = __lg(r - l + 1);
  33.     return min(st[l][j], st[r - pw(j) + 1][j]);
  34. }
  35.  
  36. int get_left(int l, int r) {
  37.     while (l < r) {
  38.         int mid = (l + r) >> 1;
  39.         if (a[mid] == a[r]) {
  40.             r = mid;
  41.         } else {
  42.             l = mid + 1;
  43.         }
  44.     }
  45.     return l;
  46. }
  47.  
  48. int main() {
  49.     ios_base::sync_with_stdio(0);
  50.     cin.tie(0);
  51.     cin >> n;
  52.     for (int i = 1; i <= n; i++) {
  53.         cin >> a[i];
  54.     }
  55.     suff[n] = st[n][0] = 0;
  56.     for (int i = n - 1; i >= 1; i--) {
  57.         if (a[i] == a[n]) continue;
  58.         suff[i] = max(0, suff[i + 1] - (a[i + 1] - a[i]) + 1);
  59.  
  60.         st[i][0] = suff[i];
  61.     }
  62.  
  63.     for (int j = 1; j < lg; j++) {
  64.         for (int i = 1; i + pw(j) - 1 <= n; i++) {
  65.             st[i][j] = min(st[i][j - 1], st[i + pw(j - 1)][j - 1]);
  66.         }
  67.     }
  68.  
  69.     cin >> m;
  70.     while (m--) {
  71.         int l, r;
  72.         cin >> l >> r;
  73.         cout << a[r] - a[l] + suff[l] - get(l, get_left(l, r)) << '\n';
  74.     }
  75.  
  76.     return 0;
  77. }
Add Comment
Please, Sign In to add comment