Cod sursa(job #2601019)

Utilizator etienAndrone Stefan etien Data 13 aprilie 2020 16:20:41
Problema Range minimum query Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include<fstream>
#include<deque>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n,q,a,b,i,v[1000001];
int mat[18][100001],minim;
deque<int>dq;
int main()
{
    fin>>n>>q;
    for(i=1; i<=n; i++)
        fin>>v[i];
    for(i=0; i<=17; i++)
    {
        int p=(1<<i);
        for(int j=1; j<=n; j++)
        {
            while(!dq.empty()&&dq.front()<j-p)
                dq.pop_front();
            while(!dq.empty()&&v[dq.back()]>=v[j])
                dq.pop_back();
            dq.push_back(j);
            if(j-p>=1)
                mat[i][j-p]=v[dq.front()];
        }
    }
    for(i=1; i<=q; i++)
    {
        fin>>a>>b;
        int dif=b-a,p=0;
        minim=v[a];
        while(dif)
        {
            if(dif%2==1)
            {
                minim=min(minim,mat[p][a]);
                a+=(1<<p);
            }
            p++;
            dif>>=1;
        }
        fout<<minim<<"\n";
    }
}