Cod sursa(job #1908890)

Utilizator tudorgalatanRoman Tudor tudorgalatan Data 7 martie 2017 10:49:47
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>

using namespace std;

ifstream fin ("rmq.in");
ofstream fout ("rmq.out");

unsigned int N, M;
unsigned int A[100001];
unsigned int x, y;

unsigned int RMQ[18][100001];
unsigned int log[100001];
unsigned int lg, range, diff;
unsigned int i, j;

unsigned int sol;

int main ()
{
    fin >> N >> M;
    for (i=1; i<=N; i++)
        fin >> A[i];
    for (i=2; i<=N; i++)
        log[i] = log[i/2] + 1;                            /// log[i] - cum se scrie i ca 2 la o putere
    for (i=1; i<=N; i++)
        RMQ[0][i] = A[i];                                 /// Prima linie este vectorul A.
    for (i=1; (1<<i)<=N; i++)
        for (j=1; j<=N-(1<<i)+1; j++)
        {
            lg = 1<<(i-1);
            RMQ[i][j] = min(RMQ[i-1][j],RMQ[i-1][j+lg]);
        }
    for (i=1; i<=M; i++)
    {
        fin >> x >> y;
        range = y - x + 1;                          /// Number of elements from x to y.
        lg = log[range];
        diff = range - (1<<lg);
        sol = min(RMQ[lg][x],RMQ[lg][x+diff]);
        fout << sol << '\n';
    }
    return 0;
}