Mai intai trebuie sa te autentifici.

Cod sursa(job #2174079)

Utilizator SqueekDanielTodasca Daniel SqueekDaniel Data 16 martie 2018 10:40:58
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <iostream>
#include <fstream>
#define dimn 1000005
#define dimp 21

std::ifstream f("rmq.in");
std::ofstream g("rmq.out");

int N, M;
int v[dimn];

int pow2[dimp];
int log2(int x) {
    int res = 0;
    while(x>1) x/=2, res++;
    return res;
} void precalc() {
    pow2[0] = 1;
    for (int i=1; i<dimp; i++)
    pow2[i] = pow2[i-1]*2;
}

int rmq[dimp][dimn];
void calc_rmq() {
    for (int i=0; i<N; i++) rmq[0][i+1] = v[i+1];
    for (int i=1, j; pow2[i]<=N; i++) {
        for (j=1; j+pow2[i]-1<=N; j++) {
            rmq[i][j] = std::min(rmq[i-1][j], rmq[i-1][j+pow2[i-1]]);
        }
    }
}
void query(int a, int b) {
    int len = b-a+1;
    int rmqord = log2(len);
    g << std::min (rmq[rmqord][a], rmq[rmqord][b-pow2[rmqord]+1]) << '\n';
}

void citire() {
    f >> N >> M;
    for (int i=0; i<N; i++)
        f >> v[i+1];
}
void rezolvare() {
    calc_rmq();
    for (int i=0, a, b; i<M; i++) {
        f >> a >> b;
        query(a, b);
    }
}

int main()
{
    precalc();
    citire();
    rezolvare();

    return 0;
}