Cod sursa(job #155976)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 12 martie 2008 11:57:03
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 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;
    if(rmq[x][p]<rmq[y-p2[p]+1][p]) fprintf(fout,"%ld\n",rmq[x][p]);
    else fprintf(fout,"%ld\n",rmq[y-p2[p]+1][p]);
  }
  fclose(fin);
  fclose(fout);
  return 0;
}