Cod sursa(job #3264838)

Utilizator iccjocIoan CHELARU iccjoc Data 24 decembrie 2024 17:24:50
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
int v[100005];
int d[100005][25];
int lg[100005];
int main()
{
    int n, m;
    lg[1] = 0;
    for(int i = 2; i <= 100000; i++)
        lg[i] = lg[(i >> 1)] + 1;
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
        cin >> v[i];
    for(int i = 1; i <= n; i++)
    {
        if(i == n)
            d[i][0] = v[i];
        else
            d[i][0] = min(v[i], v[i+1]);
    }
    for(int k = 1; k <= 20; k++)
    {
        for(int i = 1; i <= n; i++)
        {
            if(i + (1 << (k-1)) <= n)
                d[i][k] = min(d[i][k-1], d[i + (1 << (k-1))][k-1]);
            else
                d[i][k] = d[i][k-1];
        }
    }
    for(int i = 1; i <= m; i++)
    {
        int x, y;
        cin >> x >> y;
        if(x != y)
        {
            int o = y - (1 << (lg[y - x]));
            cout << min(d[x][lg[y - x]], d[o][lg[y - x]]) << "\n";
        }
        else
        {
            cout << v[x] << "\n";
        }
    }
}