Cod sursa(job #154386)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 11 martie 2008 10:08:01
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <stdio.h>
#include <math.h>
#define inf 100000

long n,mc,i,j,l,min,a[100000],m[1000];
long x,y;

long rmq(long n,long x,long y){
     long i,min=inf;
     long c1,c2;
     c1=x/l+1;
     if ((c1-1)*l+1<x)c1++;
     for (i=x;i<=(c1-1)*l&&i<=y;i++)
         if (a[i]<min)min=a[i];
     
     c2=y/l;
     i=x;
     if (c2*l+1>i)i=c2*l+1;
     for (;i<=y;i++)
         if (a[i]<min)min=a[i];
     for (i=c1;i<=c2;i++)
         if (m[i]<min)min=m[i];

return min;
}

int main(){    
    freopen ("rmq.in","r",stdin);
    freopen ("rmq.out","w",stdout);
    
    scanf ("%ld %ld",&n,&mc);
    for (i=1;i<=n;i++)scanf ("%ld",&a[i]);
    //impartirea sirului in bucati de sqrt(n);
    l=sqrt(n);
    for (i=1;i<=l;i++){
        m[i]=inf;
        for (j=(i-1)*l+1;j<=l*i;j++)
            if (a[j]<m[i])m[i]=a[j];
    }

    for (i=1;i<=mc;i++){
        scanf ("%ld %ld",&x,&y);
        printf("%ld\n",rmq(n,x,y));
    }
    
return 0;
}