Cod sursa(job #2284645)

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

using namespace std;

unsigned long RMQ[17][100001];

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

int main()
{
    unsigned long n, m, j, p, i, d, x, y, pq;
    ifstream fin("rmq.in");
    ofstream fout("rmq.out");
    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+i]);
    }
    /*for(i=0; i<=p; i++)
    {
        for(j=1; j<=n; j++)
            cout<<RMQ[i][j]<<" ";
        cout<<endl;
    }*/
    for(i=0; i<m; i++)
    {
        fin>>x>>y;
        d=y-x+1;
        pq=log2(d);
        fout<<minim(RMQ[pq][x], RMQ[pq][y-pow2(pq)+1])<<endl;
    }
}