Pagini recente » Cod sursa (job #1653590) | Cod sursa (job #236882) | Cod sursa (job #1574638) | Cod sursa (job #1768986) | Cod sursa (job #254064)
Cod sursa(job #254064)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 100001
#define LOGMAX 18
#define in "rmq.in"
#define out "rmq.out"
unsigned int a[MAX], M[MAX][LOGMAX], n;
void process_matrix()
{
unsigned int i,j;
for (j = 1 ; 1 << j <= n; j++)
for (i = 1 ; i <= n; i++)
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];
}
int main()
{
unsigned int i, z, m, x, y,j;
FILE *fin, *fout;
if ((fin = fopen(in, "r")) == NULL)
{
printf("Eroare \n");
exit(-1);
}
//read dimension of vectors
fscanf(fin, "%d%d", &n, &m);
//read the vectors
for (i = 1; i<=n ; i++)
{
fscanf(fin, "%d", &a[i]);
M[i][0] = i;
}
process_matrix();
/*
for (i = 1; i <= n; i++)
{
for (j = 0; 1 << j <= n; j++)
printf("%d ", M[i][j]);
printf("\n");
}
*/
fout = fopen(out, "w");
for (i = 0; i < m; i++)
{
fscanf(fin, "%d%d", &x, &y);
//printf("%d %d\n", x, y);
z = log(y - x + 1) / M_LN2;
//printf("%d x+ 1 <<z %d\n", z, x + (1<<z));
if (y == x + (1 << z) -1)
{
fprintf(fout, "%d\n", a[M[x][z]]);
}
else
if (a[M[x][z]] <= a[M[x + (1 << z)][z-1]])
{
//printf("\nM[%d][%d] = %d\n", x, z, M[x][z]);
fprintf(fout, "%d\n", a[M[x][z]]);
}
else
{
//printf("\nM[%d][%d] = %d\n", x + (1 << z), z - 1, M[x + (1 << z)][z-1]);
fprintf(fout, "%d\n", a[M[x + (1 << z)][z-1]]);
}
}
fclose(fin);
fclose(fout);
return 0;
}