Cod sursa(job #1970045)

Utilizator DragosCDragos Corleanca DragosC Data 18 aprilie 2017 20:27:49
Problema Range minimum query Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <stdio.h>
#include <fstream>
#define INF 200000
using namespace std;
int n,m,Pos,Val,start,finish,minim;
int MaxArb[5000000];
void Update(int nod, int left, int right)
{
    if(left==right)
    {
        MaxArb[nod]=Val;
        return;
    }
    int div=(left+right)/2;
    if(Pos<=div) Update(2*nod,left,div);
    else Update(2*nod+1,div+1,right);

    MaxArb[nod]=min(MaxArb[2*nod],MaxArb[2*nod+1]);
}
void Query(int nod, int left, int right)
{
    if(start<=left && right<=finish)
    {
        if(minim>MaxArb[nod])
            minim=MaxArb[nod];
        return;
    }
    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()
{
    ofstream g("rmq.out");
    freopen("rmq.in","r",stdin);
    scanf("%ld %ld",&n,&m);
    for(int i=1;i<=n;++i)
    {
        scanf("%ld ",&Val);
        Pos=i;
        Update(1,1,n);
    }
    int x,y,z;
    for(int i=1;i<=m;i++)
    {
            scanf("%ld %ld",&y,&z);
            minim=INF;
            start=y;
            finish=z;
            Query(1,1,n);
           g<<minim<<'\n';
    }
    return 0;
}