Pagini recente » Cod sursa (job #779205) | Cod sursa (job #326411) | Cod sursa (job #2388795) | Cod sursa (job #2351420) | Cod sursa (job #2181481)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
int main()
{ int N, Q, i, j;
FILE* fi,fo;
fi = fopen("rmq.in", "r");
fscanf(fi,"%d", &N);
fscanf(fi,"%d", &Q);
int lg = log2(N);
int** d=(int**)malloc((lg+1)*sizeof(int*));
for(i = 0; i < lg+1; i++)
{
d[i] =(int*)malloc((N+1)*sizeof(int));
}
for(j = 1; j <= N; j++)
{
fscanf(fi,"%d", &d[0][j]);
}
int x = 1;
for( i = 1; i <= lg; i++ )
{
for(j = 1; j < 2*x; j++)
{
d[i][j] = d[i-1][j];
}
for(; j <= N; j++)
{
d[i][j] = min(d[i-1][j], d[i-1][j - x]);
}
x*=2;
}
int* putere =(int *)malloc((N+2)*sizeof(int));
putere[1] = 0;
putere[0] = 0;
for( i = 2; i <= N; i++)
{
putere[i] = putere[i/2] + 1;
}
fo = fopen("rmq.out", "w");
for(i = 0; i < Q; i++)
{
int l , r;
fscanf(fi,"%d %d", &l, &r);
int len = r - l + 1;
int p = putere[len-1];
int valPutere = (1<<p);
fprintf(fo,"%d", min(d[p][r], d[p][l + valPutere - 1]));
}
free(putere);
for(i = 0; i < lg+1; i++)
free(d[i]);
free(d);
fclose(fi);
fclose(fo);
return 0;
}