Cod sursa(job #2863854)

Utilizator Madalin_IonutFocsa Ionut-Madalin Madalin_Ionut Data 7 martie 2022 12:21:17
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

int n, m, a[100003];
int rmq[21][100003], p2[100003];
/**p2[i] = lungimea putere a lui 2 maxima a unui interval care
are lungimea i
rmq[i][j] = pozitia minimului din intervalul[j, j + 2 ^ i - 1]
i = 0, 1, ...k, unde 2 ^ k <= p
*/

void RMQ()
{
    int i, j, len;
    p2[1] = 0;
    for (i = 2; i <= n; i++)
        p2[i] = 1 + p2[i / 2];
    for (i = 1; i <= n; i++)
        rmq[0][i] = i;
    for(i = 1; (1 << i) <= n; i++)
        for (j = 1; j <= n - (1 << i) + 1; j++)
        {
            len = (1 << i) - 1;
            rmq[i][j] = rmq[i - 1][j];
            if (a[rmq[i - 1][j]] > a[rmq[i - 1][j + len]])
                rmq[i][j] = rmq[i - 1][j + len];
        }
}

void Citire()
{
    int i, x, y, expo, len, sol1, sol2;
    fin >> n >> m;
    for (i = 1; i <= n; i++)
        fin >> a[i];
    RMQ();
    for (i = 1; i <= m; i++)
    {
        fin >> x >> y;
        if (x > y) swap(x, y);
        expo = p2[y - x + 1];
        len = (1 << expo);
        sol1 = rmq[expo][x];
        sol2 = rmq[expo][y - len + 1];
        if (a[sol1] > a[sol2]) fout << a[sol2] << "\n";
        else fout << a[sol1] << "\n";
    }
}

int main()
{
    Citire();
    fout.close();
    return 0;
}