Cod sursa(job #1312424)

Utilizator cipriancxFMI - gr143 Timofte Ciprian cipriancx Data 9 ianuarie 2015 15:10:47
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

int n,q,a[100001],m[100000][16];

int logaritm2(int var)
{
int au=0; while ((1<<au)<=var)au++;
return au-1;
}
void preproc()
{
    int i,j;
for(i=0; i<n; i++)m[i][0]=i;

for(j=1; (1<<j)<n; j++)
    for(i=0; i+(1<<j)-1 < n; i++)


    if(a[m[i][j-1]] < a[m[i+(1<<(j-1))][j-1]])
    m[i][j]=m[i][j-1];
else m[i][j]=m[i+(1<<(j-1))][j-1];

}
int calcul(int i, int j)
{
   int k=logaritm2(j-i+1);
if(a[m[i][k]] < a[ m[j-(1<<k)+1][k]])
    return m[i][k];
else return m[j-(1<<k)+1][k];
}

int main()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
 cin>>n>>q;
 for(int i=0; i<n; i++)scanf("%d",&a[i]);

preproc();
int a1,b1;


for(int i=1; i<=q; i++)
{
 scanf("%d %d",&a1,&b1);
 printf("%d\n",a[calcul(a1-1,b1-1)]);
}

    return 0;
}