Cod sursa(job #162507)

Utilizator alex23alexandru andronache alex23 Data 20 martie 2008 09:46:33
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <stdio.h>
#include <math.h>

int m[100001][100001],a[100001],n,k,i,j,l,r,x,y;

void rmq(int m[100001][100001], int a[100001], int n)
  {
      int i, j;

  //initialize M for the intervals with length 1
      for (i = 0; i < n; i++)
          m[i][0] = i;
  //compute values from smaller to bigger intervals
      for (j = 1; 1 << j <= n; j++)
          for (i = 0; i + (1 << j) - 1 < n; i++)
              if (a[m[i][j - 1]] < a[m[i + (1 << (j - 1))][j - 1]])
                  m[i][j] = m[i][j - 1];
              else
                  m[i][j] = m[i + (1 << (j - 1))][j - 1];
  }

int main()
 {FILE *fin,*fout;

  fin=fopen("rmq.in","r");
  fout=fopen("rmq.out","w");

  fscanf(fin,"%d %d",&n,&k);
  for (i=0;i<n;i++)
    fscanf(fin,"%d",&a[i]);

  rmq(m,a,n);

  for (l=1;l<=k;l++)
    {fscanf(fin,"%d %d",&x,&y);
     x--;
     y--;
     r=(int)(log(y-x+1));
     if (a[m[x][r]]<=a[m[y-(int)pow(2,r)+1][r]]) fprintf(fout,"%d\n",a[m[x][r]]);
                                            else fprintf(fout,"%d\n",a[m[y-(int)pow(2,r)+1][r]]);
     }

  fclose(fin);
  fclose(fout);

  return 0;
  }