Cod sursa(job #2076583)

Utilizator mihailrazMihail Turcan mihailraz Data 26 noiembrie 2017 19:59:38
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <bits/stdc++.h>
#define NMAX 100005

using namespace std;
ifstream fi("rmq.in");
ofstream fo("rmq.out");
int n,m;
int X[NMAX],LOG[NMAX];
int RMQ[20][NMAX];

void citire_vector(void)
{
    fi>>n>>m;
    for(int i=1; i<=n; i++)
        fi>>X[i];
}

void precalculare_log(void)
{
    LOG[1]=0;
    for(int i=2; i<=n; i++)
        LOG[i]=LOG[i/2]+1;
}

void precalculare_matrice(void)
{
    for(int j=1; j<=n; j++)
        RMQ[0][j]=X[j];
    for(int i=1; i<=LOG[n]; i++)
        for(int j=1; j<=n; j++)
            RMQ[i][j]=min(RMQ[i-1][j],RMQ[i-1][j+(1<<(i-1))]);
}

void rezolvare_query(void)
{
    int x,y,range;
    while(m--)
    {
        fi>>x>>y;
        if(x==y)
            fo<<RMQ[0][x]<<"\n";
        else
        {
            range=LOG[y-x+1];
            fo<<min(RMQ[range][x],RMQ[range][y-(1<<range)+1])<<"\n";
        }
    }
}

int main()
{
    citire_vector();
    precalculare_log();
    precalculare_matrice();
    rezolvare_query();
    fi.close();
    fo.close();
    return 0;
}