Cod sursa(job #3343499)

Utilizator Bogdan_RuscanuRuscanu Stefan Bogdan Bogdan_Ruscanu Data 27 februarie 2026 17:00:25
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#define int long long
const int NMAX=1000005;
const int LOG=21;

using namespace std;

ifstream cin("rmq.in");
ofstream cout("rmq.out");

int v[NMAX];
int mini[LOG][NMAX],lg[NMAX];  ///[.....][.....]

/// mini[j][i] = minimul din intervalul i...i+(2^j)-1 = i...i+2^2-1
/// mini[1][i] = min(i..i+1)
/// mini[j][i] = min(mini[j-1][i],mini[j-1][i+2^(j-1)])
/// i<=k1<=k2<=j, min(i...j) = min(min(i..k2),min(k1...j))

int query(int st,int dr)
{
    int dim=dr-st+1,ans=1e9,pow2=1,cnt=0;
    for(pow2=1;pow2<=dim;pow2*=2)
    {
        cnt++;
    }
    pow2/=2;
    cnt--;
    while(dim>0)
    {
        if(pow2<=dim)
        {
            ans=min(ans,mini[cnt][st]);
            st=st+(1<<cnt);
            dim=dr-st+1;
        }
        pow2/=2;
        cnt--;
    }
    return ans;
}

signed main()
{
    int n,k;
    cin>>n>>k;
    int pow2=1,cnt=0;
    for(int i=1;i<=n;i++)
    {
        cin>>v[i];
        mini[0][i]=v[i];
        //--------------
        lg[i]=cnt;
        if(pow2*2==i)
        {
            pow2*=2;
            cnt++;
        }
    }
    for(int j=1;(1<<j)<=n;j++)
    {
        for(int i=1;i+(1<<j)-1<=n;i++)
        {
            mini[j][i]=min(mini[j-1][i],mini[j-1][i+(1<<(j-1))]);
        }
    }
    int sum=0;
    for(int i=1;i<=k;i++)
    {
        int st,dr;
        cin>>st>>dr;
        cout<<query(st,dr)<<endl;
    }
    return 0;
}