Pagini recente » Cod sursa (job #2638556) | Cod sursa (job #2599970) | Cod sursa (job #2132902) | Cod sursa (job #2710452) | Cod sursa (job #608523)
Cod sursa(job #608523)
#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*)*maxI);
for(i = 0; i<maxI; ++i)
rmq[i] = (int*)malloc(sizeof(int)*N);
for(i = 0; i<N; ++i)
rmq[0][i] = numbers[i];
for(i = 1; i<maxI; ++i)
for(j = 0; j<N; ++j)
rmq[i][j] = min(rmq[i-1][j], rmq[i-1][min(j + (1<<(i-1)),N-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[x][i-1], rmq[x][j-(1<<x)]));
}
fclose(f);
fclose(g);
for(i = 0; i<maxI; ++i)
free(rmq[i]);
free(rmq);
free(numbers);
free(logTable);
return 0;
}