Cod sursa(job #1761283)

Utilizator dodecagondode cagon dodecagon Data 21 septembrie 2016 23:51:19
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <stdio.h>
#include <math.h>
#define min(a,b) ((a)<(b) ? (a) : (b))

char buff[1024];
int _i=1024;

int next_int(FILE * in)
{
    char x,y;
    int z=0;
   
   if (_i==1024)
    y=fread(buff,1024,1,in),_i=0;
      
     x=1;
 
      while (x<48 || x> 57)
         {  
         	x=buff[_i];
         	_i++;
         	if (_i==1024)
         		 {
         		 	y=fread(buff,1024,1,in);
         		 	_i=0;
         		 }
         }
 
      while (x>=48 && x<=57)
      {
        z=(z<<1)+(z<<3)+x-48;
        x=buff[_i];
        _i++;
         if (_i==1024)
         	 {
               y=fread(buff,1024,1,in);
               _i=0;
             }
      }
 
    return z;
}

int a[100009],m[100001][18],n,mr,i,j,k,p[20],lg[100001];


int main(int argc, char const *argv[])
{
	
	FILE * in = fopen("rmq.in","r");
	FILE * out= fopen("rmq.out","w");

      n=next_int(in);
      mr=next_int(in);

      
      for (i=0;i<n;++i)
      	 a[i]=next_int(in);

      for (i=0;i<n;++i)
      	 m[i][0]=i;
      	p[0]=1;
      	for (i=1;i<18;++i)
      		p[i]=p[i-1]*2;

      	lg[1]=0;
      for (i=2,j=1;i<=n;++i)
      	 if (i>=p[j])
      	 	 lg[i]=j++; else 
      	 	  lg[i]=j-1;

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


      
      while (mr--)
      {
         i=next_int(in)-1;
         j=next_int(in)-1;
         k=lg[j-i+1];
         
         fprintf(out,"%d\n",min(a[m[i][k]],a[m[j-p[k]+1][k]]));
      }


	fclose(in);
	fclose(out);
	return 0;
}