Cod sursa(job #3247878)

Utilizator proflaurianPanaete Adrian proflaurian Data 9 octombrie 2024 17:46:28
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.82 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
const int N = 100010;
int n,q,L,RMQ[17][N];
int main()
{

    f>>n>>q;
    /// precalculez cate linii are matricea RMQ
    for(int p=1;2*p<=n;p*=2,L++);
    /// citesc prima linie care este chiar sirul initial
    for(int i=1; i<=n; i++)
        f>>RMQ[0][i];
    /// construiesc matricea RMQ
    for(int i=1,p=1,P=2; i<=L; i++,p*=2,P*=2)
        for(int LO=1,MI=p+1,HI=P; HI<=n ; LO++,MI++,HI++)
            RMQ[i][LO]=min(RMQ[i-1][LO],RMQ[i-1][MI]);

    /// raspund la fiecare query in O(1)
    for(; q; q--)
    {
        int st,dr,lung,lin,P;
        f>>st>>dr;
        lung=dr-st+1;
        lin=31-__builtin_clz(lung);
        P=1<<lin;
        g<<min(RMQ[lin][st],RMQ[lin][dr-P+1])<<'\n';
    }
    return 0;
}