Cod sursa(job #2292913)

Utilizator dia.ionescuIonescu Diana dia.ionescu Data 30 noiembrie 2018 11:15:27
Problema Range minimum query Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <utility>
#include <algorithm>
#include <cmath>
using namespace std;

ifstream fin ("rmq.in");
ofstream fout ("rmq.out");

int main()
{
    vector<int> v;
    vector< pair<int, int> > queries;
    vector<int> min_sqrt;
    int N, M, x, y, dim;
    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);

    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;
            cout << " f l  " << l << f;
            if (f == l)
                fout << v[f] << "\n";
            else {
                for (j = 0; j * dim < f; j++);
                j++;
                cout << " j " << j;
                s = min((j - 1) * dim, l);
                cout << " s " << s;
                m = 999999999;
                for (;dim * j <= l; j++){
                    m = min(m, min_sqrt[j - 1]);
                    cout << " min " << m;
                }
                cout << " j " << j;
                d = max (dim * (j - 1), f);
                 cout << " d " << d << endl;
                for (j = f; j <= s; j++){
                    m = min(m, v[j]);
                    cout << "in prima";
                }
                for (j = d; j <= l; j++){
                    m = min(m, v[j]);
                    cout<< "in a doua";
                }
                fout << m << "\n";
            }

    }
    return 0;
}