Cod sursa(job #2904532)

Utilizator larisa-ioana.virtejanuLarisa Ioana Virtejanu larisa-ioana.virtejanu Data 17 mai 2022 23:53:27
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
	
#include <bits/stdc++.h>
 
using namespace std;
ifstream fin("rmq.in"); ofstream fout("rmq.out");
 
const int NMAX = 1e5 + 3;
 
int n, q;
int lg[NMAX], rmq[20][NMAX];
 
void build_lg()
{
    lg[1] = 0;
    for(int i = 2; i < NMAX; i++)
        lg[i] = lg[i / 2] + 1;
}
 
int mymin(int a, int b)
{
    return (a < b ? a : b);
}
 
void build_rmq()
{
    int d;
    for(int l = 1; l <= lg[n]; l++)
    {
        d = (1 << (l - 1));
        for(int i = 1; i + 2 * d - 1 <= n; i++)
            rmq[l][i] = mymin(rmq[l - 1][i], rmq[l - 1][i + d]);
    }
}
 
int query(int x, int y)
{
    int sz = (y - x + 1);
    int L = lg[sz];
 
    return mymin(rmq[L][x], rmq[L][y - (1 << L) + 1]);
}
 
int main()
{
    fin >> n >> q;
    for(int i = 1; i <= n; i++)
        fin >> rmq[0][i];
    build_lg();
    build_rmq();
 
    int a, b;
    for(int i = 1; i <= q; i ++)
        fin >> a >> b, fout << query(a, b) << '\n';
    return 0;
}