Cod sursa(job #429954)

Utilizator adrianraduleaRadulea Adrian adrianradulea Data 30 martie 2010 17:20:38
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include<stdio.h>
FILE *f,*g;
long i,put[30],n,a[100500],m[100500][25],ok,j,p,x,y,min,k;
inline long minim(long a,long b)
{ if(a<b) return a; return b; }
/*inline long vmin(long x,long y)
{ if(x==y) return a[x];
  long k=-1;
  while(1) if(x+put[k+1]<=y) k++; else break;
  return minim(m[x][k],vmin(x+put[k],y));
}  */
int main()
{ f=fopen("rmq.in","r"); g=fopen("rmq.out","w");
  put[0]=1; for(i=1;i<=20;i++) put[i]=put[i-1]*2;
  fscanf(f,"%ld%ld",&n,&p);
  for(i=1;i<=n;i++) fscanf(f,"%ld",&a[i]);
  for(i=1;i<=n;i++) m[i][0]=a[i];
  for(j=1;j<=20;j++) for(i=1;i<=n-put[j-1];i++) m[i][j]=minim(m[i][j-1],m[i+put[j-1]][j-1]); 
  for(i=1;i<=p;i++)
   { fscanf(f,"%ld%ld",&x,&y);
     min=2000000000;
     while(x!=y)
	  {   k=-1;
		  while(1) if(x+put[k+1]<=y) k++; else break;
		  if(m[x][k]<min) min=m[x][k];
		  x+=put[k];
	  }
	 if(a[y]<min) min=a[y];
     fprintf(g,"%ld\n",min);
   }
  fclose(g);
  return 0;
}