Cod sursa(job #2567245)

Utilizator serafimalex2001Serafim Alex serafimalex2001 Data 3 martie 2020 16:10:17
Problema Range minimum query Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <fstream>
using namespace std;

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

const int NMAX = 100009;
const int INF = 1<<31-1;

int tree[4*NMAX];

int N,Q;

void Update(int nod, int lf, int rg, int pos, int val)
{
    if(lf == rg)
    {
        tree[nod] = val;
        return;
    }
    int mid = lf + (rg-lf)/2;
    if(pos<=mid)
        Update(nod*2, lf, mid, pos, val);
    else Update(nod*2+1, mid+1, rg, pos ,val);
    tree[nod] = min( tree[nod*2], tree[nod*2+1] );
}

int Query(int nod,int lf ,int rg, int L, int R)
{
    if( L<=lf && rg<=R )
    {
        return tree[nod];
    }
    int mid = lf + (rg-lf)/2;
    int minim = INF;
    if( L<=mid )
        minim = min (minim, Query(nod*2, lf, mid, L, R) );
    if( mid < R)
        minim = min ( minim, Query(nod*2+1,mid+1,rg,L,R));
    return minim;
}

void Read()
{
    int i,j,x,y;
    fin>>N>>Q;
    for(i = 1; i<=4*N; ++i)
        tree[i] = INF;
    for(i = 1; i<=N; ++i)
    {
        fin>>j;
        Update( 1,1,N,i,j);
    }
    for(i = 1; i<=Q; ++i)
    {
        fin>>x>>y;
        fout<<Query(1, 1, N, x, y)<<"\n";
    }
}

int main()
{
    Read();
    return 0;
}