Cod sursa(job #3295789)

Utilizator AlinIacob_Alin-Ovidiu Iacob AlinIacob_ Data 8 mai 2025 14:43:28
Problema Range minimum query Scor 0
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.16 kb
/*
RMQ-RANGE MINIMUM QUERY
*/
#include<iostream>
using namespace std;
const int NMAX=1e5;
int rmq[NMAX+1][17];
int v[NMAX+1];
//RMQ[i][j]=minimul secventei care incepe la pozitia i si are lungimea 2^j
/*
RMQ[i][j]=min(v[i],...,v[i+2^j-1])
1 5 6 4 3
RMQ[i][j]=min(RMQ[i][j-1],RMQ[i+2^(j-1)][j-1])
RMQ[1][0]=1   RMQ[1][1]=1   RMQ[1][2]=1
RMQ[2][0]=5   RMQ[2][1]=5   RMQ[2][2]=3
RMQ[3][0]=6   RMQ[3][1]=4   RMQ[3][2]=3
RMQ[4][0]=4   RMQ[4][1]=3   RMQ[4][2]=3
RMQ[5][0]=3   RMQ[5][1]=3   RMQ[5][2]=3
[3,9]=[3,6]U[7,8]U[9,9]
[3,9]=[3,6]U[6,9]
*/
int query_1(int x, int y)
{
    int len=y-x+1;
    int p=log2(len);
    //[x,y]=[x,x+2^p-1]U[y-2^p+1,y]
    return min(rmq[x][p],rmq[y-(1<<p)+1][p]);
}
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>v[i];
    }
    //initializam coloana 0 din rmq cu valorile din vector
    for(int i=1;i<=n;i++)
    {
        rmq[i][0]=v[i];
    }
    for(int j=1;j<=int(log2(n));j++)
    {
        for(int i=1;i<=n-(1<<j)+1;i++){
            rmq[i][j]=min(rmq[i][j-1],rmq[i+(1<<(j-1))][j-1]);
        }
    }
    for(int i=1;i<=m;i++)
    {
        int x,y;
        cin>>x>>y;
        cout<<query_1(x,y)<<endl;
    }
}