Cod sursa(job #1761265)

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

int next_int(FILE * in)
{
    char x,y;
    int z=0;;
      
     x=1;
 
      while (x<48 || x> 57)
        y=fread(&x,1,1,in);
 
      while (x>=48 && x<=57)
        z=(z<<1)+(z<<3)+x-48,y=fread(&x,1,1,in);
 
    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;
}