Cod sursa(job #2359293)

Utilizator HaesteinnSabau Florin Vlad Haesteinn Data 28 februarie 2019 19:28:28
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.77 kb
#include<bits/stdc++.h>
#define NMAX 100005
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");

int n,v[NMAX],m;
int rm[NMAX][32];
int msb(int x)
{
    return 32-__builtin_clz(x);
}

void precompute()
{
    for(int i=0;i<n;i++)
        rm[i][0]=v[i];
    for(int i=1;(1<<i)<n;i++)
    {
        for(int j=0;j+(1<<i)-1<n;j++)
        {
            rm[j][i]=min(rm[j][i-1],rm[j+(1<<(i-1))][i-1]);
//            fout<<rm[j][i]<<" ";
        }
    }
}

int rmq(int a,int b)
{
    int lg=msb(b-a+1);
    lg--;
    return min(rm[a][lg],rm[b-(1<<lg)+1][lg]);
}


int main()
{
    fin>>n>>m;
    for(int i=0;i<n;i++)
        fin>>v[i];
    precompute();
    for(int i=0;i<m;i++)
    {
        int a,b;
        fin>>a>>b;
        fout<<rmq(a-1,b-1)<<'\n';
    }
    return 0;
}