Cod sursa(job #3277903)

Utilizator tedicTheodor Ciobanu tedic Data 17 februarie 2025 21:31:47
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include <fstream>

using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
int v[100005], log2[100005], dp[20][100005]; ///dp[i][j]=min pe intervalul j, j+2^i
int main()
{
    int n,m,l,r;
    cin>>n>>m;
    log2[2]=1;
    for(int i=3; i<=n; i++)
        log2[i]=log2[i/2]+1;
    for(int i=1; i<=n; i++)
    {
        cin>>v[i];
        if(i>1)
            dp[0][i-1]=min(v[i-1],v[i]);
    }
    dp[0][n]=v[n];
    for(int i=1; i<=log2[n]+1; i++)
        for(int j=1; j<=n; j++)
            if(j+(1<<i)<=n)
                dp[i][j]=min(dp[i-1][j], dp[i-1][j+(1<<(i-1))]);
    for(int i=1; i<=m; i++)
    {
        cin>>l>>r;
        ///min (l, r)= min( min(l, l+2^log2[r-l]) , min(r-2^log2[r-l], r) )
        if(l==r)
            cout<<v[l]<<'\n';
        else
            cout<<min(dp[log2[r-l]][l], dp[log2[r-l]][r-(1<<log2[r-l])])<<'\n';
    }
    return 0;
}