Cod sursa(job #2481013)

Utilizator XXMihaiXX969Gherghinescu Mihai Andrei XXMihaiXX969 Data 26 octombrie 2019 12:53:49
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <math.h>
using namespace std;

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

const int DIM = 1e5+7;
const int DIM2 = log(DIM);

int v[DIM];

int rmq[DIM][DIM2];

void build(int v[],int n)
{

    for(int i = 0; i < n; i++)
        rmq[i][0] = i;

    for(int j = 1; (1ll << j) <=n; j++)
        for(int i = 0; i + (1ll << j) - 1 < n;i++)
        if(v[rmq[i][j - 1]] < v[rmq[i + (1ll << (j - 1))][j - 1]])
        rmq[i][j] = rmq[i][j -1];
    else
        rmq[i][j] = rmq[i + (1ll << (j-1))][j - 1];

}

int query(int st, int dr)
{
    int l = dr - st + 1;
    int k = log(l);

    return min(v[rmq[st][k]], v[rmq[st + l - (1ll << k)][k]]);
}

int main()
{
    int n,m;
    in >> n >> m;

    for(int i = 0; i < n; i++)
        in >> v[i];

   build(v,n);
    while(m--)
    {
        int x, y;
        in >> x >> y;
        x--;
        y--;
        out << query(x,y) << "\n";
    }
    return 0;
}