Cod sursa(job #2396040)

Utilizator T_george_TGeorge Teodorescu T_george_T Data 3 aprilie 2019 10:23:40
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.87 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
#define NMAX 100000
int rmq[20][NMAX],depth[NMAX],n,m;
void build_rmq(){
    for(int i=0;i<n;i++)
        rmq[0][i]=i;
    for(int j=1;(1<<j)<=n;j++)
    for(int i=0;i+(1<<(j-1))-1<n;i++){
        if(depth[rmq[j-1][i]]<depth[rmq[j-1][i+1<<(j-1)]])
            rmq[j][i]=rmq[j-1][i];
        else
            rmq[j][i]=rmq[j-1][i+1<<(j-1)];
    }
}
int interogare(int i,int j){
    int pow=log2(j-i+1);
    if(depth[rmq[pow][i]]<depth[rmq[pow][j-(1<<pow)+1]])
        return depth[rmq[pow][i]];
    return depth[rmq[pow][j-(1<<pow)+1]];
}
int main()
{
    in>>n>>m;
    for(int i=0;i<n;i++)
        in>>depth[i];
    build_rmq();
    for(int j=0;j<m;j++){
        int st,dr;
        in>>st>>dr;
        out<<interogare(st-1,dr-1)<<'\n';
    }
    return 0;
}