Cod sursa(job #3226087)

Utilizator MegaCoderMinoiu Teodor Mihai MegaCoder Data 19 aprilie 2024 22:38:56
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.84 kb
#include<fstream>
#define nmax 100005
#define lgmax 20
#pragma GCC optimize ("unroll-loops")
std::ifstream fin("rmq.in");
std::ofstream fout("rmq.out");
int rmq[nmax][lgmax];
int lg[nmax];
int n, q;
void precalc()
{
    fin>>n>>q;
    lg[1]=0;
    for(int i=2; i<=n; ++i)
        lg[i]=lg[i/2]+1;

    for(int i=1; i<=n; ++i)
        fin>>rmq[i][0];

    for(int i=1; (1<<i)<=n; ++i)
        for(int j=1; j<=n-(1<<i)+1; ++j)
        {
            int l=(1<<(i-1));
            rmq[j][i]=std::min(rmq[j][i-1], rmq[j+l][i-1]);
        }
}
void solve()
{
    for(int i=0; i<q; ++i)
    {
        int l, r;
        fin>>l>>r;
        int dist=r-l+1;
        int aux=lg[dist], rem=dist-(1<<aux);
        fout<<std::min(rmq[l][aux], rmq[l+rem][aux])<<'\n';
    }
}
int main()
{
    std::ios_base::sync_with_stdio(false);
    precalc();
    solve();
    return 0;
}