Cod sursa(job #2295197)

Utilizator dia.ionescuIonescu Diana dia.ionescu Data 3 decembrie 2018 12:36:38
Problema Range minimum query Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb

#include <fstream>
#include <vector>
#include <iostream>
#include <utility>
#include <algorithm>
#include <math.h>
using namespace std;

ifstream fin ("rmq.in");
ofstream fout ("rmq.out");
std::vector<int> rmq(const std::vector<int>& input, const std::vector< std::pair<int, int> >& queries) {
     int ln;
    ln = log2(input.size());
    vector<int> v(queries.size(),0);
    vector< vector<int> > a;
    vector<int> aux(ln + 1, 0);
    for (int i = 0; i < input.size(); i++)
	a.push_back(aux);

   
    for (int i = 0; i < input.size() - 1; i++) {
       a[i][0] = min(input[i], input[i + 1]);
    }
    

    for (int j = 1; j <= ln; j++) {
        for (int i = 0 ; i < (input.size() - (1 << j)); i++) {
            a[i][j] = min(a[i][j - 1], a[(1 << (j - 1)) + i][j - 1]);
        }
    }


    for (int i = 0; i < queries.size(); i++) {
            int f, l, k;
            f = queries[i].first;
            l = queries[i].second;
            k = log2(l - f);
            if (f == l)
                v[i] = input[f];
            else
                v[i] = min(a[f][k], a[l- (1 << k)][k]);
		

   }
    return v;
}

int main()
{
    int N, M, x, y;
    fin >> N >> M;
    vector<int> raspuns(M, 0);
    vector<int> v(N,0);
    vector< pair<int, int> > queries(M, make_pair(0,0));
    for (int i = 0; i < N; i++) {
        fin >> x;
        v[i] = x;
    }

    for (int i = 0; i < M; i++) {
        fin >> x >> y;
        queries[i] = make_pair(x-1, y-1);
    }
	
    raspuns = rmq(v, queries);
    for (int i = 0; i < M; i++) {
       fout << raspuns[i] << "\n";
    }  
    return 0;
}