Cod sursa(job #1862166)

Utilizator tudorgalatanRoman Tudor tudorgalatan Data 29 ianuarie 2017 16:19:08
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 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 range, lg, 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 anumita putere
    for (i=1; i<=N; i++)
        RMQ[0][i] = A[i];
    for (i=1; (1<<i)<=N; i++)
        for (j=1; j<=N-(1<<i)+1; j++)
            RMQ[i][j] = min(RMQ[i-1][j],RMQ[i-1][j+1]);
    for (i=1; i<=M; i++)
    {
        fin >> x >> y;
        range = y - x + 1;
        lg = log[range];
        diff = range - (1<<lg);
        sol = min(RMQ[lg][x],RMQ[lg][x+diff]);
        fout << sol << '\n';
    }
    return 0;
}