Cod sursa(job #2500319)

Utilizator andu2006Alexandru Gheorghies andu2006 Data 27 noiembrie 2019 18:41:51
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.9 kb
#include<bits/stdc++.h>
#define NMAX 100001
#define LOGMAX 20
using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");
int sparse_table[NMAX][LOGMAX],n,v[NMAX];
void precalc(){
    int i,j,mid;
    for(i=0;i<n;i++)
        sparse_table[i][0]=v[i];
    for(j=1;(1<<j)<=n;j++){
        for(i=0;i<=n-(1<<j);i++){
            mid=(1<<j)/2;
            sparse_table[i][j]=min(sparse_table[i][j-1],sparse_table[i+mid][j-1]);
        }
    }
}
int pmax(int x,int& pw){
    int p=1; pw=-1;
    while(p<=x){
        p*=2;
        pw++;
    }
    return p/2;
}
int main()
{
    ios_base::sync_with_stdio(false);
    int m,i,a,b,p;
    fin>>n>>m;
    for(i=0;i<n;i++)
        fin>>v[i];
    precalc();
    for(i=0;i<m;i++){
        fin>>a>>b; a--; b--;
        int k=pmax(abs(a-b)+1,p);
        fout<<min(sparse_table[a][p],sparse_table[b-k+1][p])<<'\n';
    }
    return 0;
}