Cod sursa(job #226658)

Utilizator k_ounu_eddyIacob Eduard k_ounu_eddy Data 2 decembrie 2008 11:04:50
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<stdio.h>

int main()
{
//deschid fisierele
FILE *pin =fopen("rmq.in","r");
FILE *pout=fopen("rmq.out","w");
//int matrice[18][100002];
//declar variabile
int N,T,*log,i,j,aux,aux2,min;
int x,y,diff;
int **matrice;

//citesc pe N si t
fscanf(pin,"%d",&N);
fscanf(pin,"%d",&T);

//calc vect log
log=new int[N+1];
log[1]=0;

for(i=2;i<=N;i++)
  log[i]=log[i/2]+1;

matrice=new int*[log[N]+1];
for(i=0;i<=log[N];i++)
 matrice[i]=new int[N+1];

for(i=1;i<=N;i++)
  fscanf(pin,"%d",matrice[0]+i);
  
for(i=1;i<=log[N];i++)
  for(j=1;j<=N-(1<<i)+1;j++)
    {
    aux=1<<(i-1);
    if(matrice[i-1][j]<matrice[i-1][j+aux])
      matrice[i][j]=matrice[i-1][j];
    else
      matrice[i][j]=matrice[i-1][j+aux];
    }

for(i=1;i<=T;i++)
  {
  fscanf(pin,"%d",&x);
  fscanf(pin,"%d",&y);
  //printf("%d %d\n",x,y);

  diff=y-x+1;
  aux=log[diff];
  aux2=diff-(1<<aux);

  if(matrice[aux][x]<matrice[aux][x+aux2])
    min=matrice[aux][x];
  else
    min=matrice[aux][x+aux2];
  fprintf(pout,"%d\n",min);
  }

//eliberez memoria
//for(i=0;i<=log[N];i++)
//  delete[] matrice[i];
//delete [] matrice;
//delete []log;

//inchid fisierele
fclose(pin);
fclose(pout);
return 0;
}