Cod sursa(job #1110208)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 17 februarie 2014 21:24:01
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

template<class Type>
class RangeMinimumQuery {
  public:
    RangeMinimumQuery(const vector<Type> &_values):
      values(_values),
      data(vector< vector<int> >()),
      log2(vector<int>(int(_values.size()) + 1, -1)) {
        log2[1] = 0;
        for (int i = 2; i <= Size(); ++i)
            log2[i] = log2[i / 2] + 1;
        data = vector< vector<int> >(log2[Size()] + 1, vector<int>(Size(), -1));
        for (int i = 0; i < Size(); ++i)
            data[0][i] = i;
        for (int step = 1, length = 1; step < int(data.size()); ++step, length <<= 1) {
            for (int i = 0; i + 2 * length <= Size(); ++i) {
                if (values[data[step - 1][i]] < values[data[step - 1][i + length]])
                    data[step][i] = data[step - 1][i];
                else
                    data[step][i] = data[step - 1][i + length];
            }
        }
    }

    int Size() const {
        return int(values.size());
    }

    int QueryIndex(const int from, const int to) const {
        int step = log2[to - from + 1];
        if (values[data[step][from]] < values[data[step][to - (1 << step) + 1]])
            return data[step][from];
        else
            return data[step][to - (1 << step) + 1];
    }

    Type QueryValue(const int from, const int to) const {
        return values[QueryIndex(from, to)];
    }

  private:
    vector<Type> values;
    vector< vector<int> > data;
    vector<int> log2;
};

int main() {
    ifstream cin("rmq.in");
    ofstream cout("rmq.out");
    int n, q;
    cin >> n >> q;
    vector<int> values = vector<int>(n);
    for (int i = 0; i < n; ++i)
        cin >> values[i];
    RangeMinimumQuery<int> rmq = RangeMinimumQuery<int>(values);
    for (; q > 0; --q) {
        int from, to;
        cin >> from >> to;
        cout << rmq.QueryValue(--from, --to) << "\n";
    }
    cin.close();
    cout.close();
    return 0;
}