Cod sursa(job #932295)

Utilizator superman_01Avramescu Cristian superman_01 Data 28 martie 2013 20:17:30
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<cstdio>
#include<vector>

#define NMAX 100005
#define min(a,b) ((a)<(b)?(a):(b))

FILE *f=fopen("rmq.in","r");
FILE *g=fopen("rmq.out","w");

using namespace std;

long long lg[NMAX],rmq[18][18];
long long a[NMAX],n,m;

void read()
{
    fscanf(f,"%d%d",&n,&m);
    for(int i(1) ; i<= n ; ++i  )
        fscanf(f,"%d",&a[i]);
}
void preprocess( void )
{
    lg[1]=0;
   for(int i (2) ; i <= n ; ++i )
    lg[i]=lg[i/2]+1;

   //initializez matricea
    for(int i(1) ; i <= n ; ++i)
      rmq[0][i]=a[i];

   for(int i(1); (1<<i) <= n ; ++i )
    for(int ii(1) ; ii <= n- (1<<i) +1 ;++ii )
   {
       int len=1<<(i-1);
       rmq[i][ii]=min(rmq[i-1][ii],rmq[i-1][ii+len]);
   }

}
void Query( long long left ,long long right)
{
    long long diff,l,sx;
    diff=right-left+1;
    l=lg[diff];
    sx=diff-(1<<l);
   fprintf(g,"%lld\n",min(rmq[l][left],rmq[l][left+sx]));



}
int main( void )
{
    read();
    preprocess();
    while( m --)
    {
        long long v,b;
        fscanf(f,"%lld%lld",&v,&b);
                  Query(v,b);
    }
    fclose(f);
    fclose(g);
    return 0;
}