Cod sursa(job #2266875)

Utilizator mrhammerCiocan Cosmin mrhammer Data 22 octombrie 2018 22:12:59
Problema Range minimum query Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include<iostream>
#include<fstream>
#include<cmath>
#define MAXN 100000
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n,q;
int a[MAXN];
int m[MAXN][20];
int calc_log(int x)
{
    return floor(log2(x));
}
int query(int x,int y)
{
    int dif = y-x+1;
    int k = calc_log(dif);
    int p = pow(2,k);
    int minn = m[x-1][k];
    if(dif-p > 0) minn = min(minn,m[(x-1)+(dif-p)][k]);
    return minn;
}
int main()
{
    fin>>n>>q;
    int l = calc_log(n);
    for(int i=0;i<n;i++) fin>>a[i];
    for(int i=0;i<n;i++) m[i][0] = a[i];
    for(int j=1;j<=l;j++)
        for(int i=0;i<n;i++)
    {
        int p = j-1;
        int k = pow(2,p);
        m[i][j] = m[i][p];
        if(i+k <= MAXN) m[i][j] = min(m[i][p],m[i+k][p]);
    }
    for(int i=0;i<q;i++)
    {
        int k1,k2;
        fin>>k1>>k2;
        fout<<query(k1,k2)<<"\n";
    }
}