Cod sursa(job #1789909)

Utilizator GeanaVladGeana Vlad GeanaVlad Data 27 octombrie 2016 17:06:38
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <iostream>
#include<fstream>
#include<math.h>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int r[100001][20],n,m,i,v[100001],putere[17],x,y;
void BuildRmq()
{
    int i,j;
    for(i=0;i<n;i++)
        r[i][0]=i;
    for(j=1;putere[j]<=n;j++)
        for(i=0;i+putere[j]<=n;i++)
        if(v[r[i][j-1]]<v[r[i+putere[j]-1][j-1]])
            r[i][j]=r[i][j-1];
        else
            r[i][j]=r[i+putere[j-1]][j-1];
}
int RMQ(int low,int high)
{
    int l=high-low+1;
    int k=log2(l);
    return min(v[r[low][k]],v[r[low+l-putere[k]-1][k]]);
}
int main()
{
    f>>n>>m;
    for(i=0;i<n;i++)
        f>>v[i];
    putere[0]=1;
    putere[1]=2;
    for(i=2;i<=16;i++)
        putere[i]=putere[i-1]*2;
    BuildRmq();
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        g<<RMQ(x,y)<<'\n';
    }

}