Cod sursa(job #1442868)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 26 mai 2015 15:05:15
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <bits/stdc++.h>

using namespace std;

const int Nmax = 100000 + 1;

int T[2 * Nmax];
int N, M;

void build()
{
    for (int i = N - 1; i >= 1; i--)
        T[i] = min(T[(i << 1)], T[(i << 1) | 1]);
}

void update(int x, int value)
{
    x += N;

    T[x] = value;

    while (x > 1)
    {
        T[x >> 1] = max(T[x], T[x ^ 1]);
        x >>= 1;
    }
}

int query(int x, int y) /// [x, y)
{
    x += N;
    y += N;

    int sol = numeric_limits<int>::max();

    while (x < y)
    {
        if (x & 1)
        {
            sol = min(sol, T[x]);
            x++;
        }

        if (y & 1)
        {
            y--;
            sol = min(sol, T[y]);
        }

        x >>= 1;
        y >>= 1;
    }

    return sol;
}

int main()
{
    FILE *in = fopen("rmq.in", "r");
    FILE *out = fopen("rmq.out", "w");

    fscanf(in, "%d %d ", &N, &M);

    for (int i = 0; i < N; ++i)
        fscanf(in, "%d ", &T[i + N]);

    build();

    for (int i = 1; i <= M; ++i)
    {
        int tip, a, b;
        fscanf(in, "%d %d ", &a, &b);

        a--; b--;

        fprintf(out, "%d\n", query(a, b + 1));
    }

    return 0;
}