Cod sursa(job #1893254)

Utilizator codebreaker24Tivadar Ionut codebreaker24 Data 25 februarie 2017 16:11:23
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <iostream>
#include <fstream>
#include <cmath>
#define NMAX 100001
#define NMAXLOGN 20
using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");
int N, M, i, k, j, leftva, rightva;
int a[NMAX];
int rmq[NMAX][NMAXLOGN];


int main()
{




    fin >> N >> M;
    for(i=1; i<=N; i++)
        fin >> a[i];

    for( i=1;i <=N; i++)
        rmq[i][0] = i;

    for(j=1; 1<<j <= N; j++)
        for(i=1; i+(1<<j)-1<=N; i++)
        {
            k = 1 << (j-1);
            if(a[rmq[i][j-1]] <=a[rmq[i+k][j-1]])
             rmq[i][j] = rmq[i][j-1];
        else
            rmq[i][j] = rmq[i+k][j-1];
        }


    for(i=0; i<M; i++)
    {
        fin >> leftva >> rightva;

        k = log2(rightva - leftva +1);

        if(a[rmq[leftva][k]]  < a[rmq[rightva - (1<<k)+1][k]])
            fout << a[rmq[leftva][k]] << '\n';
        else
            fout << a[rmq[rightva- (1<<k)+1][k]] << '\n';

    }
}