Submission #1348056

#TimeUsernameProblemLanguageResultExecution timeMemory
1348056killerzaluuAlternating Heights (CCO22_day1problem1)C++20
4 / 25
72 ms13472 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 3005;

int n, k, q;
int a[N];
int mx[N];

// seen[u][v] = last timer where this pair was touched
// val[u][v] = required direction in current timer:
// 0 => u < v
// 1 => u > v
int seen[N][N];
unsigned char val[N][N];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> k >> q;
    for (int i = 1; i <= n; i++) cin >> a[i];

    int timer = 0;

    for (int l = 1; l <= n; l++) {
        timer++;
        mx[l] = l;

        for (int r = l + 1; r <= n; r++) {
            int x = a[r - 1];
            int y = a[r];

            if (x == y) break;

            int u = min(x, y);
            int v = max(x, y);

            // comparison between a[r-1] and a[r]:
            // if (r-l) is odd => a[r-1] > a[r]
            // else            => a[r-1] < a[r]
            //
            // req = 0 means u < v
            // req = 1 means u > v
            int req = ((r - l) & 1) ^ (x > y);

            if (seen[u][v] != timer) {
                seen[u][v] = timer;
                val[u][v] = req;
            } else {
                if (val[u][v] != req) break;
            }

            mx[l] = r;
        }
    }

    while (q--) {
        int l, r;
        cin >> l >> r;
        cout << (r <= mx[l] ? "YES\n" : "NO\n");
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...