Cod sursa(job #226500)

Utilizator k_ounu_eddyIacob Eduard k_ounu_eddy Data 1 decembrie 2008 20:51:08
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<stdio.h>

int main()
{
int N,T,*lg;
//int **matrice;
int matrice[18][100002];
FILE *p=fopen("rmq.in","r");
fscanf(p,"%d",&N);
fscanf(p,"%d",&T);

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

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

for(int i=1;i<=N;i++)
  fscanf(p,"%d",matrice[0]+i);

for(int i=1;i<=lg[N];i++)
  for(int j=1;j<=N-(i<<1)+1;j++)
    {int 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];
    }

FILE *pout=fopen("rmq.out","w");
int x,y,diff,aux,aux2,min;
for(int i=1;i<=T;i++)
  {
  fscanf(p,"%d",&x);
  fscanf(p,"%d",&y);
  diff=y-x+1;
  aux=lg[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);
fclose(p);

//for(int i=0;i<=lg[N];i++)
//  delete []matrice[i];
//delete []matrice;
delete []lg;

return 0;
}