Cod sursa(job #3301657)

Utilizator tedicTheodor Ciobanu tedic Data 28 iunie 2025 21:26:11
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.85 kb
#include <fstream>

using namespace std;
int v[100005], log2[100005];
int dp[20][100005]; ///dp[k][i] = min din intervalul i, i+2^k
int main()
{
    ifstream cin("rmq.in");
ofstream cout("rmq.out");
    log2[2]=1;
    for(int i=3; i<=100000; i++)
        log2[i]=log2[i/2]+1;
    int n,q;
    cin>>n>>q;
    for(int i=1; i<=n; i++)
        cin>>v[i];
    for(int i=1; i<n; i++)
        dp[0][i]=min(v[i], v[i+1]);
    for(int k=1; (1<<k)<n; k++)
    {
        for(int i=1; i<=n-(1<<k); i++)
            dp[k][i]=min(dp[k-1][i], dp[k-1][i+(1<<(k-1))]);
    }
    while(q--)
    {
        int st,dr;
        cin>>st>>dr;
        if(st==dr)
        {
            cout<<v[st]<<'\n';
            continue;
        }
        int dif=dr-st, put=log2[dif];
        cout<<min(dp[put][st], dp[put][dr-(1<<put)])<<'\n';
    }
    return 0;
}