Cod sursa(job #1940775)

Utilizator savigunFeleaga Dragos-George savigun Data 26 martie 2017 20:07:48
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 kb
#include <iostream>
#include <fstream>
#include <stdio.h>
using namespace std;

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

const int BUF_SIZE = 1 << 17;

int n, nq, ptr, out_ptr;
int m[18][100005], v[100005], lg[100005];
char buffer[BUF_SIZE], out_buffer[7000000];


void advance() {
    ptr++;
    if (ptr == BUF_SIZE) {
        ptr = 0;
        in.read(buffer, BUF_SIZE);
    }
}

int read_int() {
    int nr = 0;
    while (!isdigit(buffer[ptr])) advance();
    while (isdigit(buffer[ptr])) {
        nr = nr * 10 + (buffer[ptr] - '0');
        advance();
    }

    return nr;
}

void put_int(int nr) {

    if (nr != 0) {
        put_int(nr / 10);
        out_buffer[out_ptr++] = nr % 10 + '0';
    }
}

void write_int(int nr) {
    if (nr == 0) {
        out_buffer[out_ptr++] = '0';

    } else {
        int l = 0;
        while (nr != 0) {
            l++;
            out_buffer[out_ptr++] = nr % 10 + '0';
            nr /= 10;
        }
        for (nr = 1; nr <= l / 2; ++nr) {
            char c = out_buffer[out_ptr - l + nr - 1];
            out_buffer[out_ptr - l + nr - 1] = out_buffer[out_ptr - nr];
            out_buffer[out_ptr - nr] = c;
        }
    }

    out_buffer[out_ptr++] = '\n';
}

void read() {
    in.read(buffer, BUF_SIZE);
    n = read_int();
    nq = read_int();
    for (int i = 1; i <= n; ++i) m[0][i] = read_int();
}

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

void preprocess_rmq() {
    logs();

    for (int j = 1; (1 << j) <= n; ++j) {
        int val = n - (1 << j) + 1;
        for (int i = 1; i <= val; ++i) {
            m[j][i] = min(m[j-1][i], m[j-1][i + (1 << (j-1))]);
        }
    }
}

inline int rmq(int i, int j) {
    return min(m[lg[j - i + 1]][i], m[lg[j - i + 1]][i + j - i + 1 - (1 << lg[j - i + 1])]);
}


int main() {
    read();
    preprocess_rmq();

    for (int q = 1, i, j; q <= nq; ++q) {
        i = read_int();
        j = read_int();
        write_int(rmq(i, j));
    }


    out_buffer[out_ptr] = 0;
    out << out_buffer;

    return 0;
}