Cod sursa(job #3342007)

Utilizator Mihaita09Nechitescu Mihai Mihaita09 Data 22 februarie 2026 14:03:55
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>

using namespace std;

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

#define cin fin
#define cout fout

int n,q,a[100001],rmq[20][100001];

int p2[20];

void precalc_puteri()
{
    p2[0] = 1;
    for (int i = 1; i <= 20; i++)
    {
        p2[i] = p2[i-1]*2;
    }
}

void build_rmq()
{
    int k;
    for (int i = 1 ; i <= n; i++)
    {
        rmq[0][i] = a[i];
    }

    for(int i = 1 ; p2[i] <= n; i++)
    {
        for (int j = 1; j + p2[i] - 1 <= n; j++)
        {
            int lg = p2[i-1];

            int st = rmq[i-1][j];
            int dr = rmq[i-1][j+lg];

            rmq[i][j] = min(st,dr);
        }
    }
}

int lg[1000001];

void build_log()
{
    lg[1] = 0;
    for (int i = 2; i <= n; i++)
    {
        lg[i] = lg[i/2] + 1;
    }
}

int query(int i, int j)
{
    int lungime = j-i+1;
    int k = lg[lungime];

    int st = rmq[k][i];
    int dr = rmq[k][j-p2[k]+1];

    return min(st,dr);
}

int main()
{
    cin >> n >> q;
    for (int i = 1 ; i <= n; i++)
    {
        cin >> a[i];
    }
    precalc_puteri();
    build_rmq();
    build_log();
    for (int i = 1; i <= q; i++)
    {
        int x,y;
        cin >> x >> y;
        cout << query(x,y);
    }
}