Cod sursa(job #1804422)

Utilizator gorneanu.andreiFMI Gorneanu Andrei gorneanu.andrei Data 12 noiembrie 2016 16:00:11
Problema Range minimum query Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.62 kb
#include <stdio.h>
#include <math.h>
#define MAXN 100000
#define LOGM 20
int M[MAXN][LOGM];

void process2(int M[MAXN][LOGM], int A[MAXN], int N)
  {
      int i, j;
  //M[I][J] ----- I=POZITIE DE INCEPUT---SIRUL DE LUNGIME 2^J
  //initialize M for the intervals with length 1---SIRUL CARE INCEPE DE PE POZITIA I SI ARE LUNGIME 2^0=1

      for (i = 0; i < N; i++)
          M[i][0] = i;

  //compute values from smaller to bigger intervals
      for (j = 1; 1 << j <= N; j++){    //INTERVALE DE LUNGIME 2^J
          for (i = 0; i + (1 << j) - 1 < N; i++){
             // printf("Compara minimul sirului ce incepe pe %d si are lungime %d cu minimul \n ce incepe pe %d si are lungime %d pentru a ob minimul de pe pozitia %d cu lungime%d\n",i,1<<(j-1),i + (1 << (j - 1)),1<<(j - 1),i,1<<j);
              if (A[M[i][j - 1]] < A[M[i + (1 << (j - 1))][j - 1]])
                  M[i][j] = M[i][j - 1];
              else
                  M[i][j] = M[i + (1 << (j - 1))][j - 1];}
            //printf("\n");
            }
  }

int rezultat(int i,int j,int M[MAXN][LOGM], int A[MAXN]){

    int k;
    k = log2(j - i + 1);
    if(A[M[i][k]] < A[M[j - (1<<k) + 1][k]])
        return A[M[i][k]];
        return A[M[j - (1<<k) + 1][k]];


}

int main()

{
    int N,i,A[MAXN],t,x,y;

    FILE *f,*g;
    f=fopen("rmq.in","r");
    g=fopen("rmq.out","w");
    fscanf(f,"%d %d",&N,&t);

    for(i=0;i<N;i++)
        fscanf(f,"%d",&A[i]);

    process2(M,A,N);

    for(i = 1;i <= t; ++i){
        fscanf(f,"%d %d",&x,&y);
        fprintf(g,"%d\n",rezultat(x - 1,y - 1,M,A));
    }


    return 0;



}