Cod sursa(job #2512174)

Utilizator TudorCristeaCristea Tudor TudorCristea Data 20 decembrie 2019 17:36:03
Problema Range minimum query Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>
using namespace std;

#define ZERO 10000000

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

int N;
int Arr[100001];
int Q;
int table[100001][18];
int k;

int query (int st,int dr)
{
    int rez=ZERO;
    int i;
    for (i=k;i>=0;--i)
    {
        if (st+(1<<i)-1<=dr)
        {
            rez=min(rez,table[st][i]);
            st=st+(1<<i);
        }
    }
    return rez;
}

int main()
{
    fin >> N >> Q;
    int i,j;
    for (i=1;i<=N;++i)
    {
        fin >> Arr[i];
    }
    ///se construieste table[][]
    for (i=1;i<=N;++i)
    {
        table[i][0]=Arr[i];
    }
    k=0;
    for (j=1;(1<<j)<=N;++j)
    {
        ++k;
        for (i=1;i+(1<<j)<=N;++i)
        {
            table[i][j]=min(table[i][j-1],table[i+(1<<(j-1))][j-1]);
        }
    }
    /*
    for (i=0;i<N;++i)
    {
        for (j=0;j<=k;++j)
        {
            fout << table[i][j] << " ";
        }
        fout << '\n';
    }
    */
    for (i=1;i<=Q;++i)
    {
        int st,dr;
        fin >> st >> dr;
        fout << query(st,dr) << '\n';
    }
    fin.close();
    fout.close();
    return 0;
}