Cod sursa(job #2152465)

Utilizator andrei.gramescuAndrei Gramescu andrei.gramescu Data 5 martie 2018 16:12:40
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define NMAX 100005
#define MMAX 1000005
#define INFINIT 1000000000

typedef pair<int, int>ii;
int n, m, v[NMAX], seg[NMAX*2 - 1 + 5];
ii h[NMAX*2 - 1 + 5];

int overlap(ii a, ii b){
    if(b.first <= a.first && b.second >= a.second)
        return 1;
    if(b.second < a.first || a.second < b.first)
        return 0;
    return 2;
}

void buildTree(int left, int right, int nod){
    if(left == right){
        seg[nod] = v[left];
        h[nod].first = h[nod].second = right;
        return;
    }

    int mid = (left + right)/2;
    buildTree(left, mid, nod*2);
    buildTree(mid + 1, right, nod*2 + 1);

    seg[nod] = min(seg[nod*2], seg[nod*2 + 1]);
    h[nod].first = h[nod*2].first;
    h[nod].second = h[nod*2 + 1].second;
}

int  rmq(int left, int right, int nod){

    int aux = overlap(h[nod], ii(left, right));

    if(aux == 0){
        ///no overlap
        return INFINIT;
    }else
    if(aux == 1){
        ///total overlap
        return seg[nod];
    }else
    if(aux == 2){
        ///partial overlap
        int l = rmq(left, right, nod*2);
        int r = rmq(left, right, nod*2 + 1);
        return min(l, r);
    }
}

int main(){

    int i, x, y, tx, ty;
    FILE *fin, *fout;
    fin = fopen("rmq.in", "r");
    fout = fopen("rmq.out", "w");

    fscanf(fin, "%d %d", &n, &m);
    for(i=1; i<=n; i++)
        fscanf(fin, "%d", &v[i]);

    buildTree(1, n, 1);

    for(i=1; i<=m; i++){
        fscanf(fin, "%d %d", &x, &y);
        fprintf(fout, "%d\n", rmq(x, y, 1));
    }

    fclose(fin);
    fclose(fout);

    return 0;
}