Cod sursa(job #3038120)

Utilizator Alex_Mihai10Mihai Alex-Ioan Alex_Mihai10 Data 26 martie 2023 20:53:29
Problema Range minimum query Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#pragma GCC optimize ("03,unroll-loops")

#include <bits/stdc++.h>

using namespace std;

ifstream f("rmq.in");
ofstream g("rmq.out");

int n,m,i,j,lg,ind,x,y,nrmin,v[100005],minim[100005];

int main()
{
    f>>n>>m;
    for(i=1;i<=n;++i)
        f>>v[i];
    lg=sqrt(n);
    //g<<lg<<'\n';
    for(i=1;i<=(lg+1)*(lg+1);++i)
        minim[i]=100001;
    i=1;
    while(i+lg-1<=n)
    {
        ++ind;
        for(j=i;j<=i+lg-1;++j)
            if(v[j]<minim[ind])
                minim[ind]=v[j];
        i+=lg;
    }

    if(i<=n)
    {
        ++ind;
        for(j=i;j<=n;++j)
            if(v[j]<minim[ind])
                minim[ind]=v[j];
    }
    
    /*for(i=1;i<=ind;++i)
        g<<minim[i]<<" ";
    g<<'\n';*/
    
    for(i=1;i<=m;++i)
    {
        f>>x>>y;
        nrmin=100001;
        if(y-x<=lg)
        {
            for(j=x;j<=y;++j)
                if(v[j]<nrmin)
                   nrmin=v[j];
        }
        else
        {
        while((x-1)%lg!=0)
        {
            if(v[x]<nrmin)
                nrmin=v[x];
            ++x;
        }

        ///g<<nrmin<<'\n';

        ind=(x-1)/lg+1;
        while(ind*lg<=y)
        {
            if(minim[ind]<nrmin)
                nrmin=minim[ind];
            ++ind;
        }
        
        ///g<<nrmin<<'\n';

        --ind;
        for(j=ind*lg+1;j<=y;++j)
            if(v[j]<nrmin)
                nrmin=v[j];
        }
        
        g<<nrmin<<'\n';

    }
    return 0;
}