Pagini recente » Cod sursa (job #2533846) | Cod sursa (job #1055094) | *PAGINA LUI VI$$U* | Cod sursa (job #1186224) | Cod sursa (job #1858105)
#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;
}