Guest User

Problem I - TeamsCode summer

a guest
Aug 16th, 2025
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4.  
  5. const int lg = 18;
  6. const int Inf = 1e9 + 7;
  7.  
  8. struct SparseMin {
  9.     vector<vector<int>> t;
  10.     vector<int> l;
  11.     SparseMin(vector<int> &a) {
  12.         int n = a.size();
  13.         t.resize(lg, vector (n, INT_MAX));
  14.         l.resize(n + 1);
  15.         for (int i = 2; i <= n; i++) {
  16.             l[i] = l[i - 1];
  17.             if (1 << (l[i] + 1) <= i) l[i]++;
  18.         }
  19.         t[0] = a;
  20.  
  21.         for (int i = 1; i < lg; i++) {
  22.             for (int j = 0; j < n; j++) {
  23.                 t[i][j] = min(
  24.                     t[i - 1][j],
  25.                     t[i - 1][min(j + (1 << (i - 1)), n - 1)]
  26.                 );
  27.             }
  28.         }
  29.     }  
  30.     int query (int sl,int sr) {
  31.         int j = l[sr - sl];
  32.         return min(t[j][sl], t[j][sr - (1 << j)]);
  33.     }
  34. };
  35.  
  36. int main() {
  37.     ios_base::sync_with_stdio(false);
  38.     cin.tie(nullptr);
  39.  
  40.     int N, Q;
  41.     cin >> N >> Q;
  42.     vector<int> A(N);
  43.     for (auto &a: A) cin >> a;
  44.  
  45.     A.push_back(Inf);
  46.  
  47.     vector up(N + 1, vector<int>(lg, N));
  48.     vector mi(N + 1, vector<int>(lg, Inf));
  49.  
  50.     stack<int> ne;
  51.     ne.emplace(N);
  52.  
  53.     map<int, int> mp;
  54.     vector<int> neq(N, N);
  55.  
  56.     for (int i = N - 1; i >= 0; i--) {
  57.         if (mp.count(A[i])) {
  58.             neq[i] = mp[A[i]];
  59.         }
  60.         mp[A[i]] = i;
  61.         while (A[ne.top()] <= A[i]) ne.pop();
  62.         up[i][0] = ne.top();
  63.         mi[i][0] = A[i] - up[i][0];
  64.         ne.emplace(i);
  65.     }
  66.  
  67.     SparseMin st(neq);
  68.  
  69.     for (int j = 1; j < lg; j++) {
  70.         for (int i = 0; i < N; i++) {
  71.             up[i][j] = up[up[i][j - 1]][j - 1];
  72.             mi[i][j] = min(
  73.                 mi[i][j - 1],
  74.                 mi[up[i][j - 1]][j - 1]
  75.             );
  76.         }
  77.     }
  78.    
  79.     while (Q--) {
  80.         int l, r;
  81.         cin >> l >> r;
  82.         l--;
  83.         r = min(r, st.query(l, r));
  84.         int ans = A[l] - 1;
  85.         int i = l;
  86.         for (int j = lg - 1; j >= 0; j--) {
  87.             if (up[i][j] <= r) {
  88.                 ans = min(ans, l + mi[i][j]);
  89.                 i = up[i][j];
  90.             }
  91.         }
  92.         ans = min(ans, A[i] - (r - l));
  93.         cout << ans << '\n';
  94.     }
  95.  
  96. }
Advertisement
Add Comment
Please, Sign In to add comment