Cod sursa(job #213822)

Utilizator taloibogdanTaloi Bogdan Cristian taloibogdan Data 11 octombrie 2008 19:14:19
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.68 kb
#include<stdio.h>
long n,m,i,a[100100],p2[100100],x[20][100100],a1,a2,p,l,q;
int main()
{
 freopen("rmq.in","r",stdin);
 freopen("rmq.out","w",stdout);
 scanf("%ld%ld",&n,&m);
 for(i=1;i<=n;++i){
 scanf("%ld",&a[i]);
 if(p2[i]>1)p2[i]=p2[i/2]+1;
 x[0][i]=a[i];}
 for(i=1;(1<<i)<=n;++i)
    for(p=1;p<=n+1-(1<<i);++p)
       {l=1<<(i-1);
        if(x[i-1][p]<x[i-1][p+l])x[i][p]=x[i-1][p];
                            else x[i][p]=x[i-1][p+l];
       }
 for(i=1;i<=m;++i)
 {scanf("%ld%ld",&a1,&a2);
 p=a2-a1+1;
 q=p-(1<<p2[p]);
 if(x[p2[p]][a1]<x[p2[p]][a1+q])printf("%ld\n",x[p2[p]][a1]);
                           else printf("%ld\n",x[p2[p]][a1+q]);}
 return 0;
}