Cod sursa(job #2623608)

Utilizator grecuGrecu Cristian grecu Data 3 iunie 2020 14:57:00
Problema Range minimum query Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.11 kb
#include <bits/stdc++.h>
using namespace std;

const int bigvalue = 100001;
int N,M;
int rmqlen;

void build(int v[], int rmq[], int l = 0, int h = N - 1, int pos = 0){
    //cout << l << "  " << h << "  " << pos << "\n";;
    if(l == h){
        //cout << "aici da - ";
        rmq[pos] = v[l];
       //cout << v[l] << " " <<  rmq[pos] << "\n";
    }
    else{
        int mid = (l + h)/2;
        build(v, rmq, l, mid, 2*pos + 1);
        build(v, rmq, mid + 1, h, 2*pos + 2);
        rmq[pos] = min(rmq[2*pos+1], rmq[2*pos+2]);
        //cout << rmq[pos] << " \n";
    }
}

int RMQ(int rmq[], int ql, int qh, int l = 0, int h = N - 1, int pos = 0){
    if(ql <= l && qh >= h)
        return rmq[pos];    // total overlap;
    if(ql > h || qh < l)
        return bigvalue;    // no overleap;
    int mid = (l + h)/2;
    return min(RMQ(rmq, ql, qh, l, mid, 2*pos+1), RMQ(rmq, ql, qh, mid+1, h, 2*pos + 2));

}

int main()
{
    ifstream f("rmq.in");
    ofstream g("rmq.out");
    f >> N >> M;
    rmqlen = N - 1;
    rmqlen |= rmqlen >> 1;
    rmqlen |= rmqlen >> 2;
    rmqlen |= rmqlen >> 4;
    rmqlen |= rmqlen >> 8;
    rmqlen |= rmqlen >> 16;
    rmqlen++;

    ///*
    rmqlen = 2*rmqlen - 1;
    int v[N],rmq[rmqlen];
    for(int i = 0; i < N; i++)
        f >> v[i];
    for(int i = 0; i < rmqlen; i++)
    rmq[i] = bigvalue;

    build(v, rmq);
    int x, y;
    for (int i = 0; i < M; i++){
        f >> x >> y;
        g << RMQ(rmq, x-1, y-1)<<"\n";
    }
    //*/
    /*
    cout << rmqlen << " " << N << " " << M << "\n";
    rmqlen = 2*rmqlen - 1;
    int v[N],rmq[rmqlen];
    for(int i = 0; i < N; i++)
        f >> v[i];
    for(int i = 0; i < rmqlen; i++)
    rmq[i] = bigvalue;
    ///////////// create rmq //////////
    //// left child 2*i+1, right child 2*i+2
    //// parent (i-1)/2
    cout<<"\n";
    build(v, rmq);
    cout<<"\n\n";
    for(int i = 0; i < rmqlen; i++)
            cout << rmq[i] << " ";
    int x, y;
    for (int i = 0; i < M; i++){
        f >> x >> y;
        g << RMQ(rmq, x - 1, y - 1)<<"\n";
    }
    */
    return 0;
}