Cod sursa(job #2469686)

Utilizator Catalin2002Catalin Craciun Catalin2002 Data 7 octombrie 2019 20:54:10
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;

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

vector <int >v[50];

void creare_query(int n, int j ,int doi_i)
{
    int i;

    if(doi_i*2>n)
        return ;


    for(i=0;i< n-doi_i*2+1;i++)
    {
        int minim=min( v[j-1][i] , v[j-1][i+doi_i] ) ;

        v[j].push_back( minim );
    }

    creare_query(n, j+1 ,doi_i *2);

}

int inteogare_query(int a,int b)
{
    int lungime = b - a + 1 ,lungime_ramasa, minim;

    int i=1,ct=0;

    while(i<lungime)
        i=i*2, ct++;

    if(i!=lungime)
        ct--;
    else
        return v[ct][a];

    lungime_ramasa= lungime -i/2;

    minim =min( v[ct][a] ,v[ct][a+lungime_ramasa] );

    return minim;

}

int main()
{
    int n,m,i,j,x,a,b;

    fin>>n>>m;


    for(i=1;i<=n;i++)
    {
        fin>>x;
        v[0].push_back(x);
    }

    creare_query(n,1,1);

    for(i=1;i<=m;i++)
    {
        fin>>a>>b;

        fout<<inteogare_query(a-1,b-1)<<"\n";
    }


    return 0;
}