Cod sursa(job #2753780)

Utilizator monicaandreea46Girbea Monica monicaandreea46 Data 24 mai 2021 13:50:18
Problema Range minimum query Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <fstream>

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

int n, m, x, y, t, minim, start, finish, st, dr, tree[400001];

void update(int nod, int poz, int val, int st, int dr){
    if(st==dr){ tree[nod] = val; return; }

    int mid = (st+dr)/2;
    if( poz<=mid ) update(2*nod, poz, val, st, mid);
    if( poz>mid ) update(2*nod+1, poz, val, mid+1, dr);

    if( tree[2*nod] <= tree[2*nod+1] ) tree[nod] = tree[2*nod];
    else tree[nod] = tree[2*nod+1];
}

void query(int nod, int &minim, int start, int finish, int st, int dr){
    if( start <= st && dr<=finish ){if( minim>tree[nod] ) minim=tree[nod]; return;}

    int mid = (st+dr)/2;
    if( start<=mid ) query(2*nod, minim, start, finish, st, mid);
    if( mid<finish ) query(2*nod+1, minim, start, finish, mid+1, dr);
}

int main() {
    f>>n>>m;
    for(int i=1 ; i<=n ; i++){
        f>>x;
        update(1, i, x, 1, n);
    }

    for(int i=1 ; i<=m ; i++){
        f>>x>>y;

        minim = 100001;
        start = x;
        finish = y;
        query(1, minim, start, finish, 1, n);

        //std::cout<<minim<<"\n";
        g<<minim<<"\n";
    }

    return 0;
}