Cod sursa(job #1818040)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 28 noiembrie 2016 19:28:46
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.09 kb
#include <cstdio>
#include <algorithm>

using namespace std;

FILE *_fin;
int _in_loc; char _in_buff[4096];


void read_init(const char* nume) // Apelaţi această funcţie la începutul funcţiei <main>
{
    _fin = fopen(nume, "r");
    _in_loc = 4095;
}

char read_ch()
{
    ++_in_loc;
    if (_in_loc == 4096) {
        _in_loc = 0;
        fread(_in_buff, 1, 4096, _fin);
    }
    return _in_buff[_in_loc];
}

int read_u32() // Apelaţi această funcţie pentru a citi un număr ce se încadrează în categoria <unsigned int>
{
    int u32 = 0; char c;
    while (!isdigit(c = read_ch()) && c != '-');
    int sgn = 1;
    if (c == '-') {
        sgn = -1;
    } else {
        u32 = c - '0';
    }
    while (isdigit(c = read_ch())) {
        u32 = u32 * 10 + c - '0';
    }
    return u32 * sgn;
}

long long read_u64() // Apelaţi această funcţie pentru a citi un număr ce se încadrează în categoria <unsigned long long>
{
    long long u64 = 0; char c;
    while (!isdigit(c = read_ch()) && c != '-');
    long long sgn = 1;
    if (c == '-') {
        sgn = -1;
    } else {
        u64 = c - '0';
    }
    while (isdigit(c = read_ch())) {
        u64 = u64 * 10 + c - '0';
    }
    return u64 * sgn;
}

int rmq[18][100005];
int lg2[100005];
int pow2[18];

int main() {
    int i,j,n,q,limit,lf,rg;
    read_init("home.in");
    freopen("home.out", "w", stdout);
    n = read_u32();
    q = read_u32();
    lg2[2] = 1;
    for(i = 3;i <= n;i++){
        lg2[i] = lg2[i>>1] + 1;
    }
    pow2[0] = 1;
    for(i = 1;i <= lg2[n];i++){
        pow2[i] = pow2[i-1]<<1;
    }
    for(i = 1;i <= n;i++){
        rmq[0][i] = read_u32();
    }
    for(j = 1;j <= lg2[n];j++){
        limit = n - ((1<<j) - 1);
        for(i = 1;i <= limit;i++){
            rmq[j][i] = min(rmq[j-1][i], rmq[j-1][i + pow2[j-1]]);
        }
    }
    for(i = 1;i <= q;i++){
        lf = read_u32();
        rg = read_u32();
        limit = lg2[rg - lf + 1];
        printf("%d\n", min(rmq[limit][lf], rmq[limit][rg - pow2[limit] + 1]));
    }
    return 0;
}