Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <iostream>
- #include <string>
- #include <vector>
- using namespace std;
- class MinQueue {
- private:
- static const int MIN_FOR_EMPTY = 1e9 + 1;
- vector<int> data;
- size_t dataBegin;
- vector<int> minData;
- size_t minDataBegin;
- public:
- void push(int val) {
- data.push_back(val);
- while (minData.size() > minDataBegin && minData.back() > val) {
- minData.pop_back();
- }
- minData.push_back(val);
- }
- int min() {
- if (minDataBegin == minData.size()) {
- return MIN_FOR_EMPTY;
- } else {
- return minData[minDataBegin];
- }
- }
- void pop() {
- if (minData[minDataBegin] == data[dataBegin++]) {
- ++minDataBegin;
- }
- }
- void clear() {
- dataBegin = minDataBegin = 0;
- data.clear();
- minData.clear();
- }
- };
- class MaxQueue {
- private:
- static const int MAX_FOR_EMPTY = -(1e9 + 1);
- vector<int> data;
- size_t dataBegin;
- vector<int> maxData;
- size_t maxDataBegin;
- public:
- void push(int val) {
- data.push_back(val);
- while (maxData.size() > maxDataBegin && maxData.back() < val) {
- maxData.pop_back();
- }
- maxData.push_back(val);
- }
- int max() {
- if (maxDataBegin == maxData.size()) {
- return MAX_FOR_EMPTY;
- } else {
- return maxData[maxDataBegin];
- }
- }
- void pop() {
- if (maxData[maxDataBegin] == data[dataBegin++]) {
- ++maxDataBegin;
- }
- }
- void clear() {
- dataBegin = maxDataBegin = 0;
- data.clear();
- maxData.clear();
- }
- };
- int main() {
- MinQueue minq;
- MaxQueue maxq;
- int n;
- cin >> n;
- vector<int> a(n);
- for (auto &x : a) {
- cin >> x;
- }
- int m;
- cin >> m;
- int del;
- while (m--) {
- minq.clear();
- maxq.clear();
- cin >> del;
- int ans = 0;
- int left = 0, right = 0;
- int r = 0;
- for (int l = 0; l < n; ++l) {
- r = max(l, r);
- while (r < n && max(maxq.max(), a[r]) - min(minq.min(), a[r]) <= del) {
- minq.push(a[r]);
- maxq.push(a[r]);
- ++r;
- }
- if (ans < r - l) {
- ans = r - l;
- left = l;
- right = r - 1;
- }
- if (r > l) {
- minq.pop();
- maxq.pop();
- }
- }
- cout << left + 1 << ' ' << right + 1 << '\n';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement