Cod sursa(job #2178959)

Utilizator andrei1299Ghiorghe Andrei Alexandru andrei1299 Data 19 martie 2018 20:51:45
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <fstream>

using namespace std;
int a[300005],n,m,N=1;


void rmq()
{
    for(int i=N-1;i>0;i--)
    {
        a[i]=min(a[2*i],a[i*2+1]);
    }
}

int Query(int p, int x, int y, int st, int dr)
{
    if(x==st && y==dr)
        return a[p];      //man aici e elementul nu pozitia lui(adica p-poz) elementul e a[p]
    else
    {
    int middle=(st+dr)/2;
    if(y<=middle) return Query(2*p,x,y,st,middle);
    if(x>=middle+1) return Query(2*p+1,x,y,middle+1,dr);
    return min(Query(2*p,x,middle,st,middle),Query(2*p+1,middle+1,y,middle+1,dr));
    }
}
void Afisare()
{
    for(int i=1;i<=2*N-1;i++)
        cout<<a[i]<<" ";
}

int main()
{
    int i,x,y;

    ifstream fin("rmq.in");
    ofstream fout("rmq.out");
    fin>>n>>m;
    while(N<n)
        N*=2;
    for(i=1;i<2*N;i++)
        a[i]=100005;
    for(i=N;i<N+n;i++)
    {
        fin>>a[i];
    }
    rmq();
    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        fout<<Query(1,x,y,1,N)<<"\n";
    }
    fin.close();
    fout.close();
    return 0;
}