Cod sursa(job #226643)

Utilizator k_ounu_eddyIacob Eduard k_ounu_eddy Data 2 decembrie 2008 10:48:35
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<stdio.h>

int main()
{
//deschid fisierele
FILE *pin =fopen("rmq.in","r");
FILE *pout=fopen("rmq.out","w");

//declar variabile
int N,T,*log,**matrice,i,j,aux,aux2;
int x,y,diff;

//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);

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

  if(matrice[aux][x]<matrice[aux][x+aux2])
    fprintf(pout,"%d\n",matrice[aux][x]);
  else
    fprintf(pout,"%d\n",matrice[aux][x+aux2]);
  }
//eliberez memoria
for(i=0;i<=log[N];i++)
  delete[] matrice[i];
delete [] matrice;
delete []log;

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