Cod sursa(job #226472)

Utilizator k_ounu_eddyIacob Eduard k_ounu_eddy Data 1 decembrie 2008 20:24:10
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<stdio.h>

int N,T,*v,*lg;
int **matrice;
FILE *p;

void pregateste()
{
p=fopen("rmq.in","r");
fscanf(p,"%d",&N);
fscanf(p,"%d",&T);

v=new int[N+1];
lg=new int[N+1];
lg[1]=0;

for(int i=1;i<=N;i++)
  fscanf(p,"%d",v+i);

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

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

int minim(int a,int b)
{
if(a>b)
  return b;
else
  return a;
}

void rezolva()
{
for(int i=1;i<=N;i++)
  matrice[0][i]=v[i];

for(int i=1;i<=lg[N];i++)
  for(int j=1;j<=N-(i<<1)+1;j++)
    {int aux=1<<(i-1);
    matrice[i][j]=minim(matrice[i-1][j],matrice[i-1][j+aux]);}

FILE *pout=fopen("rmq.out","w");

for(int i=1;i<=T;i++)
  {
  int x,y;
  fscanf(p,"%d",&x);
  fscanf(p,"%d",&y);
  int diff=y-x+1;
  int aux=lg[diff];
  int aux2=diff-(1<<aux);   
  fprintf(pout,"%d\n",minim(matrice[aux][x],matrice[aux][x+aux2])); 
  }
fclose(pout);
fclose(p);
}

void finalizeaza()
{delete[] v;
for(int i=0;i<=lg[N];i++)
  delete []matrice[i];
delete []matrice;
delete []lg;}

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