Cod sursa(job #3152008)

Utilizator mihaiBoantaMihai Boanta mihaiBoanta Data 23 septembrie 2023 14:46:56
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include<fstream>
#include<iostream>
#include<cmath>
using namespace std;

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

#define nmax 100000
#define logNMAX 17
int v[nmax];
int rmq[logNMAX][nmax];
int lg2[logNMAX];
int p2[logNMAX];
int main(){
    int n,m;
    in>>n>>m;

    for(int i=0;i<n;i++){
        in>>v[i];
    }
    //log2
    lg2[0]=-1;
    int k=1;
    for(int i=1;i<=n;i++){
        if(i==k){
            lg2[i]=lg2[i-1]+1;
            k<<=1;
        }else{
            lg2[i]=lg2[i-1];
        }
    }
    //p2
    k=1;
    for(int i=0;k<=n;i++){
        p2[i]=k;
        k<<=1;
    }
    //rmq
    for(int i=0;i<n;i++){
        rmq[0][i]=v[i];
    }
    k=1;
    for(int i=1;k<=n;i++){
        for(int j=0;j<n;j++){
            if(j+k<n){
                rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+k]);
            }else{
                rmq[i][j]=rmq[i-1][j];
            }
        }
        k<<=1;
    }

    int x,y;
    for(int i=0;i<m;i++){
        in>>x>>y;
        x-=1;
        y-=1;
        int part=lg2[y-x+1];
        out<<min(rmq[part][x],rmq[part][y-p2[part]+1])<<"\n";
    }
}