Pagini recente » Cod sursa (job #2203848) | Cod sursa (job #2877012) | Cod sursa (job #2570296) | Cod sursa (job #882471) | Cod sursa (job #2796385)
#include <fstream>
using namespace std;
void construieste(int* v, int** rmq, int* pow, int* log, int n)
{
int i,j;
int k = log[n] + 1;
for(i = 1; i <= n; i++)
rmq[i][0] = v[i];
for(j = 1; j <= k; j++)
{
int p = pow[j-1];
for(i = 1; i <= n - p; i++)
rmq[i][j] = min(rmq[i][j - 1], rmq[i + p][j - 1]);
}
}
int raspunde(int** rmq, int* pow, int* log, int a, int b)
{
int k = log[b - a];
int Min1 = rmq[a][k];
int p = b - a - pow[k] + 1;
int Min2 = rmq[a + p][k];
return min(Min1, Min2);
}
int main()
{
ifstream f("rmq.in");
ofstream g("rmq.out");
int n, nr_operatii, i, j, a, b, k;
int* v = (int*)malloc(sizeof(int) * (n + 5));
int* pow = (int*)malloc(sizeof(int) * 32);
int* log = (int*)malloc(sizeof(int) * (n + 5));
int** rmq = (int**)malloc(sizeof(int*) * (n + 5));
for(i = 0; i < n + 5; i++)
rmq[i] = (int*)malloc(sizeof(int) * 20);
f >> n >> nr_operatii;
for(i = 1; i <= n; i++)
f >> v[i];
pow[0] = 1;
for(i = 1; i <= 30; i++)
pow[i] = pow[i - 1] * 2;
k = 0;
for(i = 1; i <= n; i++)
{
if(pow[k + 1] == i)
{
k++;
log[i] = k;
}
else
log[i] = k;
}
construieste(v, rmq, pow, log, n);
for(i = 1; i <= nr_operatii; i++)
{
f >> a >> b;
g << raspunde(rmq, pow, log, a, b) << '\n';
}
return 0;
}