Cod sursa(job #2850632)

Utilizator XyanEusebiu Pusca Xyan Data 17 februarie 2022 10:09:50
Problema Range minimum query Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.82 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int st[100010][18];
int N, M;
void gen(int grad)
{
    for(int i = 0; i + (1 << (grad - 1)) <= N - grad; i++)
        st[i][grad] = min(st[i][grad - 1], st[i + (1 << grad - 1)][grad - 1]);
    if(1 << ++grad <= N)
        gen(grad);
}

int rmq(int l, int r)
{
    int i = r - l, grad = 0;
    while(i>>=1) grad++;
    if(l + (1<<grad) - 1 == r)
        return st[l][grad];
    else
        return min(st[l][grad], rmq(l + (1<<grad), r));
}

int main()
{
    fin>>N>>M;
    for(int i = 0; i < N; i++)
        fin>>st[i][0];
    gen(1);
    int x, y;
    for(int i = 0; i < M; i++)
    {
        fin>>x>>y;
        x--;
        y--;
        fout<<rmq(x, y)<<"\n";
    }
    return 0;
}