Cod sursa(job #3153232)

Utilizator ArseniuVictorStefanArseniu Victor Stefan ArseniuVictorStefan Data 28 septembrie 2023 17:51:10
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <stdio.h>

#define NMAX (100000)
#define INF (0x7fffffff)

int n, q, fenwick[NMAX + 1], v[NMAX + 1];

int min(int x, int y)
{
    return x <= y ? x : y;
}

int& set_min(int& x, int y)
{
    if(y < x) x = y;
    return x;
}

void build(int* fen)
{
    for(int i = 1; i <= n; i++)
        if(i + (i & -i) <= n)
            set_min(fen[i + (i & -i)], fen[i]);
}

int fen_query(int* fen, int* v, int l, int r)
{
    int ans = INF;
    while(l < r)
    {
        int next = r - (r & -r);
        if(next < l)
        {
            set_min(ans, v[r]);
            r--;
        }
        else
        {
            set_min(ans, fen[r]);
            r = next;
        }
    }
    return ans;
}

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

    scanf("%d %d", &n, &q);
    for(int i = 1; i <= n; i++)
    {
        scanf("%d", &v[i]);
        fenwick[i] = v[i];
    }

    build(fenwick);

    for(int i = 0; i < q; i++)
    {
        int l, r;
        scanf("%d %d", &l, &r);

        printf("%d\n", fen_query(fenwick, v, l - 1, r));
    }

    return 0;
}