Cod sursa(job #2878946)

Utilizator andu9andu nita andu9 Data 28 martie 2022 10:41:45
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream f("rmq.in");
ofstream g("rmq.out");

vector <int> v, put2;
vector <vector <int>> minim;

int main ()
{
    int marime, putere2;
    int n, m, i, j, x, y;
    f >> n >> m;
    putere2 = 1, marime = 0;
    while (putere2 < n)
        putere2 *= 2, marime += 1;
    v.resize (n + 1), put2.resize (n + 1);
    minim.assign (marime + 1, vector <int> (n + 1));
    put2[0] = 1;
    for (i = 1; i <= n; i += 1)
    {
        f >> v[i];
        if (put2[i - 1] * 2 < i)
            put2[i] = put2[i - 1] * 2;
        else
            put2[i] = put2[i - 1];
    }
    for (i = 1; i <= n; i += 1)
        minim[0][i] = v[i];
    for (i = 1; i <= marime; i += 1)
    {
        for (j = 1; j <= n; j += 1)
        {
            minim[i][j] = minim[i - 1][j];
            if (j + (1 << (i - 1)) <= n and minim[i - 1][j + (1 << (i - 1))] < minim[i][j])
                minim[i][j] = minim[i - 1][j + (1 << (i - 1))];
        }
    }
    for (i = 0; i <= marime; i += 1)
    {
        for (j = 1; j <= n; j += 1)
            g << minim[i][j] << ' ';
        g << '\n';
    }
    int dist, putere;
    for (i = 1; i <= m; i += 1)
    {
        f >> x >> y;
        dist = y - x;
        putere = put2[dist];
        g << min (minim[putere][x], minim[putere][y - putere]) << '\n';
    }
    return 0;
}