Cod sursa(job #969051)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 3 iulie 2013 13:34:07
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int minimum_result[17][100002],log[100002],Arr[100002],N,M;
void Calculate_log2()
{
    int i=2,next=2;
    while(i<=N)
    {
        if(i!=next)
            log[i]=log[i-1];
        else
        {
            log[i]=log[i-1]+1;
            next=i*2;
        }
        i++;
    }
}
void Read()
{
    f>>N>>M;
    int i;
    for(i=1;i<=N;i++)
    {
        f>>Arr[i];
        minimum_result[0][i]=Arr[i];
    }
}
void Build_matrichs()
{
    int i,j,forward=1;
    for(i=1;i<=log[N];i++)
    {
        for(j=1;j<=N-forward*2+1;j++)
            minimum_result[i][j]=min(minimum_result[i-1][j],minimum_result[i-1][j+forward]);
        forward*=2;
    }
}
int  power(int x,int y)
{
    int i,p=1;
    for(i=1;i<=y;i++)
        p*=x;
    return(p);
}
void Solve()
{
    int i;
    for(i=1;i<=M;i++)
    {
        int x,y;
        f>>x>>y;
        int how_much=log[y-x+1];
        g<<min(minimum_result[how_much][x],minimum_result[how_much][y-power(2,how_much)])<<"\n";
    }
}
int main()
{
    Read();
    Calculate_log2();
    Build_matrichs();
    Solve();
    return 0;
}