Cod sursa(job #2295228)

Utilizator dia.ionescuIonescu Diana dia.ionescu Data 3 decembrie 2018 13:24:15
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <iostream>
	
#include <fstream>
	
#include <vector>
	
#include <utility>
	
#include <algorithm>
	
#include <cmath>
	
using namespace std;
	
 
	
ifstream fin ("rmq.in");
	
ofstream fout ("rmq.out");
	
vector<int> v;
	
vector< pair<int, int> > queries;
	
vector<int> min_sqrt;
	
int N, M, x, y, dim;

void rmq(const std::vector<int>& input, const std::vector< std::pair<int, int> >& queries) {
    vector<int> v(queries.size(),0);

    for (int i = 0; i < dim; i++){
	
            min_sqrt.push_back(99999999);
	
            for (int j = i * dim; j < (i+1) * dim; j++) {
	
                if (min_sqrt[i] > v[j])
	
                        min_sqrt[i] = v[j];
	
            }
	
    }
	
	
    for (int i = 0; i < M; i++) {
	
            int f, l, s, d, m, j;
	
            f = queries[i].first - 1;
	
            l = queries[i].second - 1;
	
            if (f == l)
	
                fout << v[f] << "\n";
	
            else {
	
                for (j = 0; j * dim < f; j++);
	
                j++;
	
                s = min((j - 1) * dim, l);
	
                m = 999999999;
	
                for (;dim * j <= l; j++){
	
                    m = min(m, min_sqrt[j - 1]);
	
                }
	
                d = max (dim * (j - 1), f);
	
                for (j = f; j <= s; j++){
	
                    m = min(m, v[j]);
	
                }
	
                for (j = d; j <= l; j++){
	
                    m = min(m, v[j]);
	
                }
	
                fout << m << "\n";
	
            }
	
 
	
    }
    
    //return v;
}
	
int main()
	
{
	
    fin >> N >> M;
	
    for (int i = 0; i < N; i++) {
	
        fin >> x;
	
        v.push_back(x);
	
    }
	
 
	
    for (int i = 0; i < M; i++) {
	
        fin >> x >> y;
	
        queries.push_back(make_pair(x, y));
	
    }
	
 
	
    dim = sqrt(N);
	
	rmq(v, queries);
    return 0;
	
}