Pagini recente » Cod sursa (job #360729) | Cod sursa (job #632219) | Cod sursa (job #1590243) | Cod sursa (job #1779118) | Cod sursa (job #1341686)
#include<stdio.h>
#include<algorithm>
using namespace std;
FILE *in, *out;
//definitions
#define leftSon 2*node
#define rightSon 2*node+1
//constants
const int sz = (int) 4e5+1;
const int oo = (1<<30)-1;
//variables
int n, quest;
int val, poz;
int tree[sz];
int lim1, lim2;
//functions
void arb(int node, int left, int right);
void query(int node, int left, int right);
int main(void)
{
in = fopen("rmq.in", "rt");
out = fopen("rmq.out", "wt");
fscanf(in, "%d%d", &n, &quest);
for( poz=1; poz<=n; ++poz)
{
fscanf(in, "%d", &val);
arb(1, 1, n);
}
while(quest--)
{
fscanf(in,"%d%d", &lim1, &lim2);
val = oo;
query(1, 1, n);
fprintf(out, "%d\n",val);
}
fclose(in);
fclose(out);
return 0;
}
void arb(int node, int left, int right)
{
if( left == right)
{
tree[node] = val;
return;
}
int mid = (left+right) / 2;
if( poz <= mid)
arb(leftSon, left, mid);
else
arb(rightSon, mid+1, right);
tree[node] = min(tree[leftSon], tree[rightSon]);
}
void query(int node, int left, int right)
{
if(lim1 <= left && right <= lim2)
{
val = min(val, tree[node]);
return;
}
int mid = (left+right) / 2;
if( mid >= lim1)
query(leftSon, left, mid);
if( mid < lim2)
query(rightSon, mid+1, right);
}