Cod sursa(job #1411018)

Utilizator cautionPopescu Teodor caution Data 31 martie 2015 13:18:45
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <fstream>
#include <iostream>
#include <algorithm>
#define MAXLOGN 20
#define MAXN 1000005
using namespace std;
long n, m;
long v[MAXLOGN][MAXN];
void buildRMQ()
{
    for(long k=1, powk=2; powk<=n; ++k, powk<<=1)
        for(long i=n-powk+1; i>=1; --i)
            v[k][i]=min(v[k-1][i], v[k-1][i+powk/2]);

}
long queryRMQ(long x, long y)
{
    long length, k=0, powk=1;
    length=y-x;
    while(powk<=length)
    {
        ++k;
        powk<<=1;
    }
    --k; powk>>=1;
    if(k==-1)
    {
        k=0;
        powk=1;
    }
    return min(v[k][x], v[k][y-powk+1]);
}
int main()
{
    ifstream in("rmq.in");
    ofstream out("rmq.out");
    long x, y;
    in>>n>>m;
    for(long i=1; i<=n; ++i)
        in>>v[0][i];
    buildRMQ();
    for(long i=0; i<m; ++i)
    {
        in>>x>>y;
        out<<queryRMQ(x, y)<<'\n';
    }
    return 0;
}