Cod sursa(job #2194473)

Utilizator vladboss2323Ciorica Vlad vladboss2323 Data 13 aprilie 2018 16:04:17
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <iostream>
#include <fstream>
using namespace std;

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

const int N=100005;
const int L=16;

int n,m,a[N], r[L][N],lg[N];

/*
r[i][j] = min (v[j], v[j-1], ..., v[j - 2^i + 1]) = minimul pe intervalul de lungime 2^i care se termina in j

r[i][j] = min(r[i-1][j], r[i-1][j - (1<<i)])

query(a, b):
min(r[l][a+(1<<l)-1], r[l][b])

l = [log(b-a)]

lg[1] = 0;
for (i = 1; i <= n; i++)
{
    lg[i] = 1 + lg[i/2];
}

*/

int main()
{
    int i,j,l;
    in>>n>>m;
    for(i=1; i<=n; i++)
        in>>a[i];
    for(i=2; i<=n; i++)
        lg[i]=1+lg[i/2];
    for(i=1; i<=n; i++)
        r[0][i]=a[i];
    for(i=1; (1<<i)<=n; i++)
        for(j=1; j<=n-(1<<j)+1; j++)
        {
            r[i][j]=min(r[i-1][j],r[i-1][j-(1<<i)]);
        }
    while(m!=0)
    {
        int a,b;
        in>>a>>b;
        l=lg[a-b];
        out<<min(r[l][a+(1<<l)-1],r[l][b])<<'\n';
        m--;
    }
    return 0;
}