Cod sursa(job #2338570)

Utilizator Anime_LoverAnime Lover Anime_Lover Data 7 februarie 2019 16:59:23
Problema Range minimum query Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <assert.h>

using namespace std;

#define dim 1000050

ifstream fi("rmq.in");
ofstream fo("rmq.out");

const long int INF=1e9;
long int mr[2*dim +56];
long int value,poz,start,finish,n,m,minim;

long int Minim(long int a, long int b)
{
    if(a < b)
        return a;
    else
        return b;
}

void update(long int nod, long int left, long int right)
{
    if(left==right)
    {
        mr[nod]=value;
        return;
    }

    long int div=(left+right)/2;

    if(poz<=div)
        update(2*nod,left,div);
    else
        update(2*nod+1,div+1,right);

    mr[nod]=Minim(mr[2*nod],mr[2*nod+1]);
}

void query(long int nod,long int left, long int right)
{
    if(start<=left && right<=finish)
    {
        if(minim > mr[nod])
            minim= mr[nod];
        return;
    }

    long int div=(left+right)/2;

    if(start <= div )
        query(2*nod,left,div);
    if(div < finish)
        query(2*nod+1,div+1,right);
}

int main()
{
    fi>>n>>m;

    for(long int i=1;i<=n;i++)
    {
        fi>>value;
        poz=i;

        update(1,1,n);
    }


    for(long int i=1;i<=m;i++)
    {
        fi>>start>>finish;
        minim=INF;

        query(1,1,n);

        fo<<minim<<'\n';
    }

    return 0;
}