Pagini recente » Cod sursa (job #186516) | Cod sursa (job #1905030) | Cod sursa (job #682073) | Cod sursa (job #3286010) | Cod sursa (job #765528)
Cod sursa(job #765528)
#include <stdio.h>
FILE *in, *out;
long int intervalTree[262144], min, value;
int N, M, left, right, position;
void add(int l, int r, int pos)
{
if(l == r)
intervalTree[pos] = value;
else
{
int middle = (r - l) / 2 + l;
if(position <= middle)
add(l, middle, pos << 1);
else
add(middle + 1, r, (pos << 1) + 1);
if(intervalTree[pos] == 0 || intervalTree[pos] > value)
intervalTree[pos] = value;
}
}
void query(int l, int r, int pos)
{
if(left <= l && r <= right)
{
if(intervalTree[pos] < min)
min = intervalTree[pos];
}
else
{
int middle = (r - l) / 2 + l;
if(left <= middle)
query(l, middle, pos << 1);
if(middle < right)
query(middle + 1, r, (pos << 1) + 1);
}
}
int main()
{
in = fopen("rmq.in", "r");
out = fopen("rmq.out", "w");
fscanf(in, "%d %d", &N, &M);
for(position = 1; position <= N; ++position)
{
fscanf(in, "%ld", &value);
value++;
add(1, N, 1);
}
for(; M; --M)
{
fscanf(in, "%d %d", &left, &right);
min = 1 << 30;
query(1, N, 1);
fprintf(out, "%ld\n", --min);
}
fclose(in);
fclose(out);
return 0;
}