Cod sursa(job #623300)

Utilizator ioalexno1Alexandru Bunget ioalexno1 Data 19 octombrie 2011 17:33:49
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <iostream>
#include <stdio.h>
#include <math.h>
#define nm 100000
#define abs(x) x<0 ? (-x) : (x)
using namespace std;
int a[nm],m[nm][20],i,j,n,q,k,x,y,c1;
double c;
int main()
{
int exp;
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%d %d\n",&n,&q);
for(i=1;i<=n;i++)
    {
    scanf("%d\n",&a[i]);
    m[i][0]=a[i];
    }
j=2;
exp=1;
while(j<=n)
    {
        x=j/2;
        for(i=1;i<=n-j+1;i++)
            if(a[m[i][exp-1]]<a[m[i+x][exp-1]]) m[i][exp]=m[i][exp-1];
            else m[i][exp]=m[i+x][exp-1];
    j=j*2;
    exp=exp+1;
    }
for(i=1;i<=q;i++)
    {
        scanf("%d %d\n",&x,&y);
        c=floor(log2(abs(y-x+1)));
        c1=floor(c);
        k=floor(pow(2,c));
        if(a[m[x][c1]]<a[m[y-k+1][c1]]) printf("%d\n",a[m[x][c1]]);
        else printf("%d\n",a[m[y-k+1][c1]]);
    }
fclose(stdout);
fclose(stdin);
return 0;
}