Cod sursa(job #2550497)

Utilizator PaulOrasanPaul Orasan PaulOrasan Data 18 februarie 2020 20:19:53
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <iostream>
#include <cmath>
using namespace std;

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

const int NMAX=100010;

int n,m;
int v[NMAX];
int minim[NMAX][(int)floor(log2(NMAX))+4];
void citire()
{
    fin>>n>>m;
    for (int i=1; i<=n; i++)
        fin>>v[i];
}
void calculareMinim()
{
    for (int i=1; i<=n; i++){
        minim[i][0]=v[i];
    }
    for (int j=1; (1<<j)<=n; j++){
        for (int i=1; i+(1<<j)-1<=n; i++){
            minim[i][j]=min(minim[i][j-1],minim[i+(1<<(j-1))][j-1]);
        }
    }
}
int query(int i,int j)
{
    int k=(int)floor(log2(j-i+1));
    return min(minim[i][k],minim[j-(1<<k)+1][k]);
}
void rezolvare()
{
    int a,b;
    for (int i=1; i<=m; i++){
        fin>>a>>b;
        fout<<query(a,b)<<'\n';
    }
}
int main()
{
    citire();
    calculareMinim();
   /* for (int i=1; i<=n; i++){
        for (int j=0; i+(1<<j)-1<=n; j++){
            fout<<minim[i][j]<<' ';
        }
        fout<<'\n';
    }*/
    cout<<(int)floor(log2(NMAX));
    rezolvare();
    fin.close();
    fout.close();
    return 0;
}