Cod sursa(job #1955210)

Utilizator KOzarmOvidiu Badea KOzarm Data 5 aprilie 2017 21:03:26
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>

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

struct el
{
    int st,dr,val;
}a[300000];

int n,m,x,y;

void preprocesare(int poz,int st,int dr)
{
    a[poz].st=st;
    a[poz].dr=dr;
    a[poz].val=1000000000;
    if(st!=dr)
    {
        preprocesare(2*poz,st,(st+dr)/2);
        preprocesare(2*poz+1,(st+dr)/2+1,dr);
    }
}

void add(int i,int val)
{
    int poz=1;
    while(a[poz].st!=a[poz].dr)
    {
        a[poz].val=min(a[poz].val,val);
        if(a[2*poz].dr>=i)
            poz=2*poz;
        else
            poz=2*poz+1;
    }
    a[poz].val=val;
}

int getMin(int poz,int st,int dr)
{
    if(a[poz].st>=st&&a[poz].dr<=dr)
        return a[poz].val;
    else
    if(a[2*poz].dr<st)
        return getMin(2*poz+1,st,dr);
    else
    if(a[2*poz+1].st>dr)
        return getMin(2*poz,st,dr);
    else
    {
        int x=getMin(2*poz,st,dr);
        int y=getMin(2*poz+1,st,dr);
        return min(x,y);
    }
}

int main()
{
    fin>>n>>m;
    preprocesare(1,1,n);
    for(int i=1;i<=n;i++)
    {
        fin>>x;
        add(i,x);
    }
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y;
        fout<<getMin(1,x,y)<<"\n";
    }
    return 0;
}