Cod sursa(job #3363365)

Utilizator horia.boeriuBoeriu Horia Andrei horia.boeriu Data 16 august 2026 21:54:20
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <bits/stdc++.h>

using namespace std;
const int MAXN = 100000;
const int MAXL = 17;
int rmq[MAXL][MAXN + 1];
char expo[MAXN + 1];

int minim(int a, int b) {
    return a < b ? a : b;
}
int readInt(FILE *fin) {
    int x;
    char ch;
    ch = fgetc(fin);
    while (isspace(ch)) {
        ch = fgetc(fin);
    }
    x = 0;
    while (isdigit(ch)) {
        x = x * 10 + ch - '0';
        ch = fgetc(fin);
    }
    return x;
}
int query(int st, int dr) {
    int e, p;
    e = expo[dr - st + 1];
    p = (1 << e);
    return minim(rmq[e][st], rmq[e][dr - p + 1]);
}
int main()
{
    FILE *fin, *fout;
    int n, m, i, st, dr, j, p;
    fin = fopen("rmq.in", "r");
    n = readInt(fin);
    m = readInt(fin);
    rmq[0][1] = readInt(fin);
    for (i = 2; i <= n; i++) {
        rmq[0][i] = readInt(fin);
        expo[i] = expo[i / 2] + 1;
    }
    j = p = 1;
    while (2 * p <= n) {
        for (i = 1; i <= n - 2 * p + 1; i++) {
            rmq[j][i] = minim(rmq[j - 1][i], rmq[j - 1][i + p]);
        }
        p *= 2;
        j++;
    }
    fout = fopen("rmq.out", "w");
    for (i = 0; i < m; i++) {
        st = readInt(fin);
        dr = readInt(fin);
        fprintf(fout, "%d\n", query(st, dr));
    }
    fclose(fin);
    fclose(fout);
    return 0;
}