Pagini recente » Cod sursa (job #786592) | Cod sursa (job #1290576) | Cod sursa (job #2483746) | Monitorul de evaluare | Cod sursa (job #1804414)
#include <stdio.h>
#include <math.h>
void process2(int M[100][100], int A[100], 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[100][100], int A[100]){
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,M[100][100],A[100],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;
}