Cod sursa(job #3357953)

Utilizator TestLicenta123Test Test TestLicenta123 Data 13 iunie 2026 22:11:44
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int SIZE = 1 << 20;
char in[SIZE];
int in_pos = 0, in_len = 0;

inline char get_char() {
    if (in_pos == in_len) {
        in_pos = 0;
        in_len = fread(in, 1, SIZE, stdin);
        if (in_len == 0) return EOF;
    }
    return in[in_pos++];
}

inline int read_int() {
    int x = 0;
    char c;
    while ((c = get_char()) < '0' || c > '9') {
        if (c == EOF) return 0;
    }
    do {
        x = x * 10 + (c - '0');
    } while ((c = get_char()) >= '0' && c <= '9');
    return x;
}

char out[1 << 20];
int out_pos = 0;

inline void flush_out() {
    fwrite(out, 1, out_pos, stdout);
    out_pos = 0;
}

inline void write_int(int x) {
    char temp[10];
    int len = 0;
    if (x == 0) {
        out[out_pos++] = '0';
    } else {
        while (x > 0) {
            temp[len++] = (x % 10) + '0';
            x /= 10;
        }
        while (len > 0) {
            out[out_pos++] = temp[--len];
        }
    }
    out[out_pos++] = '\n';
    if (out_pos >= 1 << 19) {
        flush_out();
    }
}

int n, m;
int st[18][100005];
int lg[100005];

int main() {
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);

    n = read_int();
    m = read_int();

    for (int i = 1; i <= n; i++) {
        st[0][i] = read_int();
    }

    for (int i = 2; i <= n; i++) {
        lg[i] = lg[i / 2] + 1;
    }

    for (int k = 1; (1 << k) <= n; k++) {
        for (int i = 1; i + (1 << k) - 1 <= n; i++) {
            st[k][i] = min(st[k-1][i], st[k-1][i + (1 << (k-1))]);
        }
    }

    for (int i = 0; i < m; i++) {
        int x = read_int();
        int y = read_int();
        int l = lg[y - x + 1];
        write_int(min(st[l][x], st[l][y - (1 << l) + 1]));
    }

    flush_out();

    return 0;
}