Cod sursa(job #2787782)

Utilizator TeodorMarciucMarciuc Teodor TeodorMarciuc Data 24 octombrie 2021 00:07:23
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <iostream>
#include <cstdio>
#include <fstream>
using namespace std;
int n, q, rmq[100005][25], p = 1, lg, ex, pw[100005], x, y, j;
int putere(int a, int b)
{
    if (b == 0) return 1;
    if (b % 2 == 0)
        return putere(a, b / 2) * putere(a, b / 2);
    else if (b % 2 == 1) return putere(a, b / 2) * putere(a, b / 2) * a;
}
int main()
{
    ifstream cin("rmq.in");
    ofstream cout("rmq.out");
    cin >> n >> q;
    for (int i = 1;i <= n;i++) {
        cin>>rmq[i][0];
        if (p * 2 <= i)
        {
            ex++;
            p = p * 2;
        }
        pw[i] = ex;
    }
    for (lg = 2, j = 1;lg <= n;lg *= 2, j++)
        for (int i = 1;i + lg-1 <= n;i++)
            rmq[i][j] = min(rmq[i][j - 1], rmq[i + lg / 2][j - 1]);
    while (q) {
        cin >> x >> y;
        cout << min(rmq[x][pw[y - x + 1]], rmq[y - putere(2,pw[y-x+1]) + 1][pw[y - x + 1]]) <<'\n';
        q--;
    }
}