Cod sursa(job #155969)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 12 martie 2008 11:52:02
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 0.71 kb
#include<stdio.h>
FILE*fin=fopen("rmq.in","r");
FILE*fout=fopen("rmq.out","w");
#define maxn 100001
#define min(a,b)((a)<(b)?(a):(b))
long p2[21],a[maxn],rmq[maxn][21],n,m,x,y,nr;
int main()
{
  int i,p;
  fscanf(fin,"%ld%ld",&n,&m);
  for(i=1;i<=n;i++)
  {
    fscanf(fin,"%ld",&a[i]);
    rmq[i][0]=a[i];
  }
  p2[0]=1;
  for(i=1;i<=20;i++)
    p2[i]=p2[i-1]*2;
  for(p=1;p<=20;p++)
    for(i=1;i<=n-p2[p]+1;i++)
      rmq[i][p]=min(rmq[i][p-1],rmq[i+p2[p-1]][p-1]);
  for(i=1;i<=m;i++)
  {
    fscanf(fin,"%ld%ld",&x,&y);
    nr=y-x+1;
    for(p=20;p>=0;p--)
      if(nr&p2[p]) break;
    fprintf(fout,"%ld\n",min(rmq[x][p],rmq[y-p2[p]+1][p]));
  }
  fclose(fin);
  fclose(fout);
  return 0;
}