Cod sursa(job #1862181)

Utilizator tudorgalatanRoman Tudor tudorgalatan Data 29 ianuarie 2017 16:28:56
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <fstream>

using namespace std;

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

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

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

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;
}