Cod sursa(job #2124920)

Utilizator CodrinsahCotarlan Codrin Codrinsah Data 7 februarie 2018 18:34:54
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include <fstream>
using namespace std;
ifstream fi("rmq.in");
ofstream fo ("rmq.out");
int n,nq,a[100005],m[100005][33];
void precalc()
{
    int i,bit;
    for (i=1;i<=n;i++) m[i][0]=a[i];
    int bitmax=0;
    while ((1<<bitmax)<n) bitmax++;
    for (bit=1;bit<=bitmax;bit++)
        for (i=1;i+(1<<bit)-1<=n;i++)
        m[i][bit]=min(m[i][bit-1],m[i+(1<<(bit-1))][bit-1]);
}
int answer(int st,int dr)
{
    int s1,s2,bit=0;
    while ((1<<bit)<(dr-st)) bit++;
    s1=m[st][bit];
    s2=m[dr-(1<<bit)+1][bit];
    return min(s1,s2);
}
int main()
{
    fi>>n>>nq;
    for (int i=1;i<=n;i++) fi>>a[i];
    precalc();
    for (int i=1;i<=nq;i++)
    {
        int p1,p2;
        fi>>p1>>p2;
        fo<<answer(p1,p2)<<'\n';
    }
    return 0;
}