Cod sursa(job #1804373)

Utilizator delia_ioanaCeapa Delia Ioana delia_ioana Data 12 noiembrie 2016 15:09:18
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <vector>
#include <math.h>
#include <stdio.h>

using namespace std;

int main() {
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);

    int n, m, a;
    scanf("%d %d", &n, &m);
    vector<int> v(n, 0);

    for (int i = 0; i < n; i ++)
    	scanf("%d", &v[i]);

    int l = (int)(log(n) / log(2));
    vector<vector<int> > rmq(n, vector<int>(l + 1));

    for (int i = 0; i < n; i ++)
    	rmq[i][0] = i;

    for (int j = 1; j <= l; j ++) 
    	for (int i = 0; i < n - (1 << (j - 1)); i ++)
    		rmq[i][j] = (v[rmq[i][j - 1]] < v[rmq[i + (1 << (j - 1))][j - 1]] ? rmq[i][j - 1] : rmq[i + (1 << (j - 1))][j - 1]);

    /*for (int i = 0; i < n; i ++){
        for (int j = 0; j <= l; j ++)
    		cout << rmq[i][j] << " ";
    	cout << endl;
    }*/

    for (int i = 0; i < m; i ++) {
        int r1, r2;
        scanf("%d %d", &r1, &r2);
        r1 --;
        r2 --;

        int range = r2 - r1 + 1, lr = (int)(log(range) / log(2));

        int sol = rmq[r1][lr];
        range -= (1 << lr);
        if (range != 0)
            sol = (v[sol] < v[rmq[r1 + range][lr]] ? sol : rmq[r1 + range][lr]);
        printf("%d\n", sol + 1);
    }

    return 0;
}