Pagini recente » Cod sursa (job #199957) | Cod sursa (job #1696808) | Cod sursa (job #2000951) | Cod sursa (job #2989024) | Cod sursa (job #608520)
Cod sursa(job #608520)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define infile "rmq.in"
#define outfile "rmq.out"
inline int min(const int a, const int b)
{
return a<b?a:b;
}
inline int max(const int a, const int b)
{
return a>b?a:b;
}
int main()
{
int N, M;
FILE *f = fopen(infile, "r");
FILE *g = fopen(outfile, "w");
int *logTable;
int *numbers;
int **rmq;
int i, j, k;
int maxI;
fscanf(f,"%d%d",&N,&M);
numbers = (int*)malloc(sizeof(int)*N);
for(i = 0; i < N; ++i)
fscanf(f,"%d", &numbers[i]);
logTable = (int*)malloc(sizeof(int)*N);
logTable[0] = logTable[1] = 0;
for(i = 2; i<N; ++i)
logTable[i] = 1 + logTable[i/2];
maxI = logTable[N/2] + 2;
rmq = (int**)malloc(sizeof(int*)*N);
for(i = 0; i<N; ++i){
rmq[i] = (int*)malloc(sizeof(int)*maxI);
rmq[i][0] = numbers[i];
}
for(j = 1; j<maxI; ++j)
for(i = 0; i<N; ++i)
rmq[i][j] = min(rmq[i][j-1], rmq[min(i + (1<<(j-1)),N-1)][j-1]);
for(k = 0; k<M; ++k){
int x;
fscanf(f,"%d%d",&i,&j);
x = logTable[j-i+1];
fprintf(g,"%d\n",min(rmq[i-1][x], rmq[j-(1<<x)][x]));
}
fclose(f);
fclose(g);
for(i = 0; i<N; ++i)
free(rmq[i]);
free(rmq);
free(numbers);
free(logTable);
return 0;
}