Advertisement
Derga

Untitled

Aug 22nd, 2023
754
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.62 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. class MinQueue {
  9. private:
  10.     static const int MIN_FOR_EMPTY = 1e9 + 1;
  11.     vector<int> data;
  12.     size_t dataBegin;
  13.     vector<int> minData;
  14.     size_t minDataBegin;
  15.  
  16. public:
  17.     void push(int val) {
  18.         data.push_back(val);
  19.         while (minData.size() > minDataBegin && minData.back() > val) {
  20.             minData.pop_back();
  21.         }
  22.         minData.push_back(val);
  23.     }
  24.  
  25.     int min() {
  26.         if (minDataBegin == minData.size()) {
  27.             return MIN_FOR_EMPTY;
  28.         } else {
  29.             return minData[minDataBegin];
  30.         }
  31.     }
  32.  
  33.     void pop() {
  34.         if (minData[minDataBegin] == data[dataBegin++]) {
  35.             ++minDataBegin;
  36.         }
  37.     }
  38.  
  39.     void clear() {
  40.         dataBegin = minDataBegin = 0;
  41.         data.clear();
  42.         minData.clear();
  43.     }
  44. };
  45.  
  46. class MaxQueue {
  47. private:
  48.     static const int MAX_FOR_EMPTY = -(1e9 + 1);
  49.     vector<int> data;
  50.     size_t dataBegin;
  51.     vector<int> maxData;
  52.     size_t maxDataBegin;
  53.  
  54. public:
  55.     void push(int val) {
  56.         data.push_back(val);
  57.         while (maxData.size() > maxDataBegin && maxData.back() < val) {
  58.             maxData.pop_back();
  59.         }
  60.         maxData.push_back(val);
  61.     }
  62.  
  63.     int max() {
  64.         if (maxDataBegin == maxData.size()) {
  65.             return MAX_FOR_EMPTY;
  66.         } else {
  67.             return maxData[maxDataBegin];
  68.         }
  69.     }
  70.  
  71.     void pop() {
  72.         if (maxData[maxDataBegin] == data[dataBegin++]) {
  73.             ++maxDataBegin;
  74.         }
  75.     }
  76.  
  77.     void clear() {
  78.         dataBegin = maxDataBegin = 0;
  79.         data.clear();
  80.         maxData.clear();
  81.     }
  82. };
  83.  
  84. int main() {
  85.     MinQueue minq;
  86.     MaxQueue maxq;
  87.     int n;
  88.     cin >> n;
  89.     vector<int> a(n);
  90.     for (auto &x : a) {
  91.         cin >> x;
  92.     }
  93.     int m;
  94.     cin >> m;
  95.     int del;
  96.     while (m--) {
  97.         minq.clear();
  98.         maxq.clear();
  99.         cin >> del;
  100.         int ans = 0;
  101.         int left = 0, right = 0;
  102.         int r = 0;
  103.         for (int l = 0; l < n; ++l) {
  104.             r = max(l, r);
  105.             while (r < n && max(maxq.max(), a[r]) - min(minq.min(), a[r]) <= del) {
  106.                 minq.push(a[r]);
  107.                 maxq.push(a[r]);
  108.                 ++r;
  109.             }
  110.             if (ans < r - l) {
  111.                 ans = r - l;
  112.                 left = l;
  113.                 right = r - 1;
  114.             }
  115.             if (r > l) {
  116.                 minq.pop();
  117.                 maxq.pop();
  118.             }
  119.         }
  120.         cout << left + 1 << ' ' << right + 1 << '\n';
  121.     }
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement