Cod sursa(job #2174739)

Utilizator dumitrescu_andreiDumitrescu Andrei dumitrescu_andrei Data 16 martie 2018 13:12:59
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f("rmq.in");
ofstream g("rmq.out");

int n,m,minim,arb[500005];

void add(int start, int stop, int val, int poz, int loc)
{
    if(start == stop)
    {
        arb[loc]=val;
        return;
    }else{
        int mid = (start+stop)/2;
        if(poz<=mid) add(start,mid,val,poz,2*loc);
        else add(mid+1,stop,val,poz,2*loc+1);
        arb[loc]=min(arb[2*loc],arb[2*loc+1]);
    }
}

void query(int start,int stop, int left, int right, int poz)
{
    if(left<=start && stop<=right)
    {
        minim=min(minim,arb[poz]);
        return;
    }
    if(start!=stop)
    {
        int mid =(start+stop)/2;
        if(left<=mid) query(start,mid,left,right,2*poz);
        if(right>mid) query(mid+1,stop,left,right,2*poz+1);
    }
}

int main()
{
    memset(arb,INT_MAX,sizeof(arb));
    f>>n>>m;
    for(int i=1;i<=n;++i)
    {
        int x;
        f>>x;
        add(1,n,x,i,1);
    }

    for(int i=1;i<=m;++i)
    {
        int x,y;
        f>>x>>y;
        minim = INT_MAX;
        query(1,n,x,y,1);
        g<<minim<<'\n';
    }

}