Cod sursa(job #982871)

Utilizator danalex97Dan H Alexandru danalex97 Data 10 august 2013 13:39:10
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <fstream>
using namespace std;

const int Nmax = 100010;
const int Lgmax = 20;

ifstream F("rmq.in");
ofstream G("rmq.out");

int RMQ[Lgmax][Nmax];
int Log[Nmax],N,M;
int A[Nmax];

void Make_RMQ(int N)
{
    for (int i=1,j=0;i<=N;i*=2,++j)
        Log[i] = j;
    for (int i=2;i<=N;++i)
        Log[i] = Log[i] == 0 ? Log[i-1] : Log[i];
    for (int i=1;i<=N;++i)
        RMQ[0][i] = A[i];
    for (int now=1;now<=Log[N];++now)
    {
        int step = (1<<now) / 2;
        for (int i=1;i<=N-step;++i)
            RMQ[now][i] = min( RMQ[now-1][i] , RMQ[now-1][i+step] );
    }
}

int ask(int x,int y)
{
    int len = y-x+1;
    int now = Log[len];
    int step = (1<<now);
    return min( RMQ[now][x] , RMQ[now][y-step+1] );
}

int main()
{
    F>>N>>M;
    for (int i=1;i<=N;++i)
        F>>A[i];

    Make_RMQ(N);

    for (int i=1,x,y;i<=M;++i)
    {
        F>>x>>y;
        G<<ask(x,y)<<'\n';
    }
}