Cod sursa(job #1377390)

Utilizator pop_bogdanBogdan Pop pop_bogdan Data 5 martie 2015 21:29:36
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <fstream>
using namespace std;

ifstream is("rmq.in");
ofstream os("rmq.out");

int N, Q, LG[100001], PW[17], LEN, x, y;
int D[17][100001];

void Input()
{
    is >> N >> Q;
    LG[2] = 1;
    for ( int i = 3; i <= 100001; ++i )
        LG[i] = LG[(i>>1)] + 1;

    PW[0] = 1;
    for ( int i = 1; i <= 16; ++i )
        PW[i] = (PW[i-1] << 1);

    for ( int i = 1; i <= N; ++i )
        is >> D[0][i];

}

void Build()
{
    for ( int i = 1; i <= LG[N]; ++i )
        for ( int j = 1; j <= N; ++j )
            D[i][j] = min(D[i-1][j],D[i-1][j + PW[i-1]]);
}

void Query()
{
    is >> x >> y;
    LEN = y - x + 1;

    int F = LG[LEN];

    os << min(D[F][x], D[F][y - PW[F] + 1]) << '\n';
}



int main()
{
    Input();
    Build();
    for ( int i = 1; i <= Q; ++i )
        Query();

    is.close();
    os.close();
}