Pagini recente » Cod sursa (job #1111840) | Cod sursa (job #1880876) | Cod sursa (job #1001502) | Cod sursa (job #1045302) | Cod sursa (job #829743)
Cod sursa(job #829743)
#include <stdio.h>
#include <vector>
#include<malloc.h>
#include<cmath>
using namespace std;
int log2(int x)
{
return (int)(log(x) / log(2));
}
int rmq(int x, int y, int *vect, int lg1)
{
static int *lg, **rmq, n, *a = NULL;
static int lMax;
int l, diff, sh;
if(vect != a)
{
a = vect;
n = lg1;
//memory allocation
lg = (int *) malloc((n + 1) * sizeof(int));
lMax = log2(n) + 1;
rmq = (int **) malloc((lMax + 1) * sizeof(int*));
for(int i = 0; i <= lMax; i++)
rmq[i] = (int *) malloc((n + 1) * sizeof(int*));
//computing the values
lg[1] = 0;
for (int i = 2; i <= n; i++)
lg[i] = lg[i/2] + 1;
for (int i = 1; i <= n; i++)
rmq[0][i]= a[i];
for (int i=1; (1 << i) <= n;i++)
{
for (int j = 1; j <= n - (1 << i) + 1; j++)
{
l = 1 << (i - 1);
rmq[i][j]= min(rmq[i-1][j] , rmq[i-1][j+l]);
}
}
}
//calculating required Range Minimum Query
diff = y - x + 1;
l = lg[diff];
sh = diff - (1 << l);
return min(rmq[l][x], rmq[l][x+sh]);
}
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
int *vect;
int n, m, a, b;
scanf("%d%d", &n, &m);
vect = (int*) malloc((n + 1) * sizeof(int));
for(int i = 1; i <= n; i++)
scanf("%d", vect + i);
for(int i = 1; i <= m; i++)
{
scanf("%d%d", &a, &b);
printf("%d\n", rmq(a, b, vect, n));
}
return 0;
}