Cod sursa(job #1249795)

Utilizator ThomasFMI Suditu Thomas Thomas Data 27 octombrie 2014 15:04:41
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <fstream>
#include <algorithm>
using namespace std;

#define NMax 100005
#define LGMax 18

ifstream f("rmq.in");
ofstream g("rmq.out");

int n,m,lgn;
int RMQ[NMax][LGMax],v[NMax];

void build()
{
    int x;
    for(int aux=1;aux<=n;aux<<=1) lgn++;

    for(int j=1;j<=lgn;++j) for(int i=1;i<=n;++i)
    {
        x=i+(1<<(j-1));
        if(x>n) RMQ[i][j]=RMQ[i][j-1];
        else
        {
            if( v[RMQ[i][j-1]] < v[RMQ[x][j-1]] ) RMQ[i][j]=RMQ[i][j-1];
            else RMQ[i][j]=RMQ[x][j-1];
        }
    }
}

int main()
{
    int i,a,b,p,aux;

    f>>n>>m;
    for(i=1;i<=n;i++) f>>v[i],RMQ[i][0]=i;

    build();

    while(m--)
    {
        f>>a>>b;
        for(p=-1,aux=1;aux<=b-a+1;aux<<=1) p++;
        g<<min(v[RMQ[a][p]],v[RMQ[b-(1<<p)+1][p]])<<"\n";
    }

    f.close();
    g.close();
    return 0;
}