Cod sursa(job #2284656)

Utilizator teotironTiron Teodor teotiron Data 17 noiembrie 2018 12:20:36
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <iostream>
#include <fstream>

using namespace std;

unsigned long RMQ[17][100001];
ifstream fin("rmq.in");
ofstream fout("rmq.out");

int log2(unsigned long x)
{
    int i=0;
    int p=1;
    while(p<=x)
    {
        p=p*2;
        i=i+1;
    }
    return i-1;
}

unsigned long pow2(unsigned long x)
{
    unsigned i;
    unsigned long p=1;
    for(i=0; i<x; i++)
    {
        p=p*2;
    }
    return p;
}

unsigned long minim(unsigned long a, unsigned long b)
{
    if(a<b)
        return a;
    else
        return b;
}

void query(unsigned i)
{
    unsigned long x, y, d, p;
    fin>>x>>y;
    d=y-x+1;
    p=log2(d);
    fout<<minim(RMQ[p][x], RMQ[p][y-pow2(p)+1])<<endl;
}

int main()
{
    unsigned long n, m, j, p, i;
    fin>>n>>m;
    for(j=1; j<=n; j++)
    {
        fin>>RMQ[0][j];
    }
    p=log2(n);
    for(i=1; i<=p; i++)
    {
        for(j=1; j<=n-pow2(i)+1; j++)
            RMQ[i][j]=minim(RMQ[i-1][j], RMQ[i-1][j+pow2(i)-1]);
    }
    for(i=0; i<m; i++)
    {
        query(i);
    }
}