Cod sursa(job #966639)

Utilizator hiticas_abelhiticasabel hiticas_abel Data 26 iunie 2013 13:08:14
Problema Plantatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <ctime>
#include <utility>

using namespace std;

ifstream cin("rmq.in");
ofstream cout("rmq.out");

const int N = 100005;

int n, m, v[N], lg[N], RMQ[20][N];

int main()
{
    cin >> n >> m;
    for(int i = 1 ; i <= n ; ++ i)
        cin >> v[i];
    for(int i = 2 ; i <= n ; ++ i)
        lg[i] = lg[i/2] + 1;
        //cout << "lg[" <<i<< "] = " << lg[i] << "\n";

    for(int i = 1 ; i <= n ; ++ i)
        RMQ[0][i] = v[i];

    for(int i = 1 ; (1 << i) <= n ; ++ i)
        for(int j = 1 ; j <= n - (1<<i) + 1; ++ j)
        {
            int l = ( 1 << (i-1) );
            //cout << " i = " << i << " j = " << j << " l = " << l << '\n';
            RMQ[i][j] = min(RMQ[i-1][j], RMQ[i-1][j+l]);
            //cout << "RMQ["<<i<<"]["<<j<<"] = " << RMQ[i][j] << '\n';
        }
    for(int i = 1;  i <= m ; ++ i)
    {
        int x, y;
        cin >> x >> y;
        int diff = y - x + 1;
        int l = lg[diff];
        int sh = diff - (1 << l);
        cout << min(RMQ[l][x], RMQ[l][x+sh]) << "\n";
    }
    return 0;
}