Cod sursa(job #2605598)

Utilizator KlinashkaDiacicov Calin Marian Klinashka Data 25 aprilie 2020 15:22:34
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <fstream>

using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

short log[100001];
int A[100001], MIN[100001][18], M, N;

void preprocess()
{
    for(short i=0;(1<<i)<=N;i++)
    {
        for(int j=0;j<(1<<i) && (1<<i)+j<=N;j++)
            log[(1<<i)+j]=i;
    }

    for(int i=1;i<=N;i++)
        MIN[i][0]=A[i];

    for(short i=1;(1<<i)<=N;i++)
    {
        for(int j=1;j+(1<<i)-1<=N;j++)
            MIN[j][i]=(MIN[j][i-1]<MIN[j+(1<<(i-1))][i-1])?MIN[j][i-1]:MIN[j+(1<<(i-1))][i-1];
    }
}

void init()
{
    fin>>N>>M;
    for(int i=1;i<=N;i++)
        fin>>A[i];
}


void query()
{
    short k;
    int x, y, rez;
    for(int i=0;i<M;i++)
    {
        fin>>x>>y;
        k=log[y-x+1];
        rez=(MIN[x][k]<MIN[y-(1<<k)+1][k]?MIN[x][k]:MIN[y-(1<<k)+1][k]);
        fout<<rez<<'\n';
    }
}


int main()
{
    init();
    preprocess();
    query();
    return 0;
}