Cod sursa(job #2124757)

Utilizator lorena1999Marginean Lorena lorena1999 Data 7 februarie 2018 16:17:05
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <iostream>
#include <fstream>
#include <climits>
#define inf INT_MAX

using namespace std;

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

int n, v[1000001], arb[10000001], m, q[10000001];

void build(int st, int dr, int nod)
    {
        if(st<dr)
        {
            int mij=(st+dr)/2;
            build(st, mij, 2*nod);
            build(mij+1, dr, 2*nod+1);
            arb[nod]=min(arb[2*nod], arb[2*nod+1]);
        }
        else
            arb[nod]=v[st];
    }

int query(int st, int dr, int x, int y, int nod)
    {
        //cout<<nod<<" "<<st<<" "<<dr<<endl;
        if(x<=st && y>=dr)
            {
              //  cout<<st<<" "<<dr<<" "<<nod<<" "<<arb[nod]<<endl;
                return nod;
            }
        else
            if(!(y<st || x>dr))
        {
            int mij=(st+dr)/2;
            int rez1=query(st, mij, x, y, 2*nod);
            int rez2=query(mij+1, dr, x, y, 2*nod+1);
            //cout<<"HERE ";
            if(rez1==rez2 && rez1==inf)
                return inf;
            else if(rez1==inf && rez2!=inf)
                return rez2;
            else if(rez2==inf && rez1!=inf)
                return rez1;
            else
                if(arb[rez1]<arb[rez2])
                    {
                        //cout<<rez1<<endl;
                        return rez1;
                    }
            else if(arb[rez1]>arb[rez2]){
                //cout<<rez2<<endl;
                return rez2;
            }
        }
        else return inf;


    }

int main()
{
    int x, y;
    f>>n>>m;
    for(int i=1; i<=n; i++)
        f>>v[i];
    build(1, n, 1);
    for(int i=1; i<=m; i++)
        {
            f>>x>>y;
            g<<arb[query(1, n, x, y, 1)]<<'\n';
        }
    /*for(int i=1; i<=2*n-1; i++)
        cout<<arb[i]<<" ";*/
    return 0;
}