Cod sursa(job #228670)

Utilizator k_ounu_eddyIacob Eduard k_ounu_eddy Data 7 decembrie 2008 18:55:05
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<stdio.h>
int n,**matrice,*log,t;
FILE *pin=fopen("rmq.in","r");

void pregateste()
{
fscanf(pin,"%d",&n);
fscanf(pin,"%d",&t);

log=new int[n+1];
log[1]=0;

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

matrice=new int*[log[n]+1];

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

for(int i=1;i<=n;i++)
  fscanf(pin,"%d",matrice[0]+i);
}

void rezolva()
{
int aux;
for(int i=1;i<=log[n];i++)
  for(int j=1;j<=n-log[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];
    }
int x,y,diff,aux2,min;
FILE *pout=fopen("rmq.out","w");

for(int 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])
    min=matrice[aux][x];
  else
    min=matrice[aux][x+aux2];
  fprintf(pout,"%d\n",min);
  }
fclose(pout);
}

void incheie()
{
for(int i=0;i<=log[n];i++)
  delete []matrice[i];
delete []matrice;
delete []log;
fclose(pin);
}

int main()
{
pregateste();
rezolva();
incheie();
return 0;
}