Cod sursa(job #1425543)

Utilizator pop_bogdanBogdan Pop pop_bogdan Data 27 aprilie 2015 17:14:17
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <fstream>
using namespace std;

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

int N, Q, D[18][100001], x, y;
int lg[100001], pw[18];
void Build();
void Query();

int main()
{
    is >> N >> Q;
    Build();
    for ( int i = 1; i <= Q; ++i )
        Query();

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

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

    lg[1] = 0;
    for ( int i = 2; i <= N; ++i )
        lg[i] = lg[(i>>1)] + 1;

    pw[0] = 1;
    for ( int i = 1; i <= 21; ++i )
        pw[i] = (pw[i-1] << 1);

    for ( int i = 1; i <= lg[N]; ++i )
        for ( int j = 1; j <= N - pw[i-1] + 1; ++j )
            D[i][j] = min(D[i-1][j], D[i-1][j + pw[i-1]]);
}

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

    if ( pw[lg[len]] != len )
        os << min(D[lg[len]][x],D[lg[len]][y - pw[lg[len]] + 1]) << "\n";
    else
        os << D[lg[len]][x] << "\n";
}