Cod sursa(job #1858105)

Utilizator veleanduAlex Velea veleandu Data 27 ianuarie 2017 00:34:41
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 kb
#include <fstream>
 
using namespace std;
 
ifstream f("rmq.in");
ofstream g("rmq.out");
 
const int kBufferSize = 1e4;
int bufferInd = kBufferSize;
char buffer[kBufferSize];

void nextChar() {
	if (++bufferInd >= kBufferSize) {
		f.read(buffer, kBufferSize);
		bufferInd = 0;
	}
}

bool valid(char c) {
	return (c == '-' or ('0' <= c and c <= '9'));
}

char currentChar() {
	if (bufferInd > kBufferSize) {
		nextChar();
	}
	return buffer[bufferInd];
}

template<typename number>
void readNumber(number &a) {
	a = 0;
	bool signedNumber = false;
	if (currentChar() == '-') {
		signedNumber = true;
	}

	for (; not valid(currentChar()); nextChar())
		;

	for (; valid(currentChar()); nextChar()) {
		a *= 10;
		a += currentChar() - '0';
	}

	if (signedNumber) {
		a *= -1;
	}
	return ;
}
 
int n, m, sgm_tree[400004], v[100001];
 
int minim(int a, int b)
{
    return (a > b) ? b : a;
}
 
void update(int node)
{
    sgm_tree[node] = minim(sgm_tree[node << 1], sgm_tree[(node << 1) + 1]);
}
 
void build_sgm_tree(int node, int left, int right)
{
    if(left == right)
        sgm_tree[node] = v[left];
    else
    {
        int mid = (right + left) >> 1;
 
        build_sgm_tree(node << 1, left, mid);
        build_sgm_tree((node << 1) + 1, mid + 1, right);
 
        update(node);
    }
}
 
int query(int node, int left, int right, int x, int y)
{
    if(x <= left && right <= y)
        return sgm_tree[node];
    else
    {
        int mid = (right + left) >> 1, answer = 0;
 
        if(x > mid)
            answer = query((node << 1) + 1, mid + 1, right, x, y);
        else if(y <= mid)
            answer = query(node << 1, left, mid, x, y);
        else
            answer = minim(query((node << 1) + 1, mid + 1, right, mid + 1, y), query(node << 1, left, mid, x, mid));
 
        return answer;
    }
}
 
int main()
{
    int i, a, b;
 
    readNumber(n);
    readNumber(m);
 
    for(i = 1; i < n + 1; i++)
        readNumber(v[i]);
 
    build_sgm_tree(1, 1, n);
 
    for(i = 0; i < m; i++)
    {
        readNumber(a);
        readNumber(b);
 
        g << query(1, 1, n, a, b) << "\n";
    }
 
    return 0;
}