Cod sursa(job #2465499)

Utilizator Catalin2002Catalin Craciun Catalin2002 Data 30 septembrie 2019 10:54:28
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

const int numax=100005;

int v[100005];
int w[10000];

int n,m,divizare;

int minim(int a,int b)
{
 if(a<b)
    return a;

 return b;
}

int functie_stabilere_inceput(int a)
{
    int j=a/divizare+1,minimum=numax;

    while(a/divizare!=j)
    {
        minimum=minim(v[a],minimum);
        a++;
    }

    return minimum;
}

int functie_stabilere_sfarsit(int b)
{
    int j=b/divizare-1,minimum=numax;

    while(b/divizare!=j)
    {
        minimum=minim(v[b],minimum);
        b--;
    }

    return minimum;
}

int functie_stabilere_mijloc(int inceput,int sfarsit)
{
    int minimum=numax;

    for(int i=inceput;i<=sfarsit;i++)
        minimum=minim(minimum,w[i]);

    return minimum;
}


int functie_minim(int a,int b)
{
    int inceput, sfarsit,inainte,mijloc,dupa;

    if(a/divizare==(a-1)/divizare)
    {
        inainte=functie_stabilere_inceput(a);
        inceput=a/divizare+1;
    }
    else
    {
        inceput=a/divizare;
    }


    if(b/divizare==(b+1)/divizare)
    {
        dupa=functie_stabilere_sfarsit(b);
        sfarsit=b/divizare-1;
    }
    else
    {
        sfarsit=b/divizare;
    }

    mijloc=functie_stabilere_mijloc(inceput,sfarsit);

    return minim(inainte,minim(mijloc,dupa));

}



int main()
{
    int i,j,x,y;

    fin>>n>>m;

    divizare=sqrt(n);


    for(i=0;i<=divizare+1;i++)
        w[i]=numax;


    for(i=1;i<=n;i++)
    {
        fin>>v[i];

        j=i/divizare;

        w[j]=minim(w[j],v[i]);

    }


    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        fout<<functie_minim(x,y)<<"\n";
    }


    return 0;
}