Cod sursa(job #2272101)

Utilizator Cristi_ChiraChira Cristian Cristi_Chira Data 29 octombrie 2018 18:09:10
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <bits/stdc++.h>
#define dm 100002
#define lbmax 18
#define ll long long
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
ll lb[dm], v[dm];
ll rmq[lbmax][dm];
ll n, m, k, difference, a, b, lg2, shift;
int main()
{
    fin >> n >> m;
    for(int i = 1; i <= n; i++)
        fin >> v[i];

    for(int i = 2; i <= n; i++)
        lb[i] = lb[i/2] + 1;
    for(int i = 1; i <= n; i++)
        rmq[0][i] = v[i];

    for(int i = 1; (1<<i) <= n; i++)
    {
        for(int j = 1; j <= n - (1<<i) + 1; j++)
        {
            k = (1<<(i-1));
            rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + k]);
        }
    }
    for(int i = 1; i <= m; i++)
    {
        fin >> a >> b;
            difference = b - a + 1;
            lg2 = lb[difference];
            shift = difference - (1<<lg2);
            fout << min(rmq[lg2][a], rmq[lg2][a + shift]) << "\n";

    }
    return 0;
}