Cod sursa(job #2796385)

Utilizator roberttrutaTruta Robert roberttruta Data 7 noiembrie 2021 23:08:02
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#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;
}