Cod sursa(job #1667429)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 28 martie 2016 22:06:39
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <fstream>
#define oo (1<<30)

using namespace std;

ifstream in("rmq.in");
ofstream out("rmq.out");
const int NMAX = 100001;
int n,m;
int AI[4*NMAX+69];

void Update(int nod,int st,int dr,int a,int val)
{
    if(st==dr)
        AI[nod] = val;
    else
    {
        int m = (st+dr)/2;
        if(a <= m)
            Update(2*nod,st,m,a,val);
        if(a > m)
            Update(2*nod+1,m+1,dr,a,val);
        AI[nod] = min(AI[2*nod],AI[2*nod+1]);
    }
}

int Query(int nod,int st,int dr,int a,int b)
{
    if(a <= st && dr<=b)
        return AI[nod];
    else
    {
        int m = (st+dr)/2;
        int m1 = oo;
        int m2 = oo;
        if(a<=m)
            m1 = Query(2*nod,st,m,a,b);
        if(b>m)
            m2 = Query(2*nod+1,m+1,dr,a,b);
        return min(m1,m2);
    }
}

int main()
{
    in>>n>>m;
    int x;
    for(int i=1;i<=n;i++)
    {
        in>>x;
        Update(1,1,n,i,x);
    }
    int y;
    for(int i=1;i<=m;i++)
    {
        in>>x>>y;
        out<<Query(1,1,n,x,y)<<"\n";
    }
    in.close();
    out.close();
    return 0;
}