Cod sursa(job #1307154)

Utilizator refugiatBoni Daniel Stefan refugiat Data 1 ianuarie 2015 14:39:25
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include<iostream>
#include<fstream>
#include<algorithm>
#include<bitset>
#include<stack>
using namespace std;
#define maxpoz 105000
int m[maxpoz];
void init(int nod,int st,int dr,int v[])
{
    if(st==dr)
    {
        //cout<<st<<' '<<nod<<' '<<v[st]<<endl;
        m[nod]=v[st];
        return;
    }
    int mij=(st+dr)/2;
    init((nod+1)*2-1,st,mij,v);
    init((nod+1)*2,mij+1,dr,v);
    m[nod]=min(m[(nod+1)*2-1],m[(nod+1)*2]);
}
int intr(int st,int dr,int nod,int b,int e)
{
    if(st>=b&&dr<=e)
        return m[nod];
    if(dr<b||st>e)
        return -1;
    int a,c,mij=(st+dr)/2;
    a=intr(st,mij,(nod+1)*2-1,b,e);
    c=intr(mij+1,dr,(nod+1)*2,b,e);
    if(a==-1)
        return c;
    if(c==-1)
        return a;
    return min(a,c);
}
int main()
{
    ifstream si;
    si.open("rmq.in");

    ofstream so;
    so.open("rmq.out");
    int n,x;
    si>>n>>x;
    int v[n],i;
    for(i=0;i<n;++i)
        si>>v[i];
    init(0,0,n-1,v);
    int a,b;
    for(i=0;i<x;++i)
    {
        si>>a>>b;
        --a;
        --b;
        so<<intr(0,n-1,0,a,b)<<'\n';
    }
}