Cod sursa(job #2706054)

Utilizator DragosC1Dragos DragosC1 Data 13 februarie 2021 18:14:45
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>
#include <iostream>
using namespace std;

ifstream f;
ofstream g;
int n, q;
int rmq[20][100001];
int a[100001];
int lg[100001];

void read() {
    int i;
    f.open("rmq.in");
    f >> n >> q;
    for (i = 1; i <= n; i++)
        f >> a[i];
}

void solve() {
    int i, j, d;
    for (i = 1; i <= n; i++)
        rmq[0][i] = a[i];

    //lg[i] = log2(i)
    lg[1] = 0;
    for (i = 2; i <= n; i++)
        lg[i] = 1 + lg[i / 2];

    for (i = 1; (1 << i) <= n; i++)
        for (j = 1; j <= n - (1 << i) + 1; j++) {
            d = (1 << (i - 1));
            rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + d]);
        }
    
    int x, lung, y, shift;

    g.open("rmq.out");
    for (i = 1; i <= q; i++) {
        f >> x >> y;
        lung = y - x + 1;
        d = lg[lung];
        shift = lung - (1 << d);
        g << min(rmq[d][x], rmq[d][x + shift]) << '\n';
    }
    f.close();
    g.close();
}

int main() {
    read();
    solve();
    return 0;
}