Cod sursa(job #3247788)

Utilizator PitigoiOlteanEmanuelPitigoi Oltean Emanuel PitigoiOlteanEmanuel Data 9 octombrie 2024 10:03:44
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#include <climits>
#include <vector>
#include <queue>

using namespace std;

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

int rmq[20][100005];
int put[30];
int main()
{
    int n,m;
    cin>>n>>m;

    for(int i=1;i<=n;i++)
    {
        cin>>rmq[0][i];
    }


    put[0]=1;
    for(int i=1;i<20;i++)
    {
        put[i]=put[i-1]*2;

    }
    for(int i=1;i<=18;i++)
    {
        for(int k=1;k<=n-put[i-1]+1;k++)
        {
            rmq[i][k]=rmq[i-1][k];
            if(k+put[i-1]<=n)
            {
                rmq[i][k]=min(rmq[i][k],rmq[i-1][k+put[i-1]]);

            }
        }
    }

    for(int i=1;i<=m;i++)
    {
        int a,b;
        cin>>a>>b;
        if(b<a)
        {
            swap(a,b);
        }
        if(a==b)
        {
            cout<<rmq[0][a]<<'\n';
            continue;
        }

        int dif=b-a+1,r=0;
        for(int k=0;k<=30;k++)
        {

            if(dif<put[k])
            {
                break;
            }
            r=k;
        }
        //cout<<r<<" ";
        //cout<<rmq[r][a]<<'\n'<<rmq[r][b-r+1]<<'\n';
        cout<<min(rmq[r][a],rmq[r][b-put[r]+1])<<'\n';

    }




    return 0;
}