Cod sursa(job #2106415)

Utilizator dumitrescu_andreiDumitrescu Andrei dumitrescu_andrei Data 15 ianuarie 2018 19:09:54
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("rmq.in");
ofstream g("rmq.out");
int n,m,arb[500005],minim;

void aranjare(int start, int stop, int poz,int el, int val)
{
    if(start == stop)
    {
        arb[poz]=val;
        return;
    }

    int mid = start+(stop-start)/2;

    if(el<=mid)
        aranjare(start,mid,2*poz,el,val);
    else
        aranjare(mid+1,stop,2*poz+1,el,val);

    arb[poz]=min(arb[2*poz],arb[2*poz+1]);
}

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

    }
}

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