Pagini recente » Cod sursa (job #1708682) | Cod sursa (job #1859559) | Cod sursa (job #1884458) | Cod sursa (job #1045424) | Cod sursa (job #830738)
Cod sursa(job #830738)
#include <stdio.h>
#include <vector>
#include<malloc.h>
#include<cmath>
using namespace std;
#define mn(a, b) compare(a, b) < 0? a : b;
int log2(int x)
{
return (int)(log(x) / log(2));
}
int rmq(int x, int y, int *vect, int lg1, int (*compare) (int x, int y))
{
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]= mn(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 mn(rmq[l][x], rmq[l][x+sh]);
}
int comp(int a, int b)
{
if(a < b)
return -1;
if(a > b)
return 1;
return 0;
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.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, comp));
}
return 0;
}