Pagini recente » Cod sursa (job #2361441) | Cod sursa (job #581218) | Cod sursa (job #1080726) | Cod sursa (job #1772136) | Cod sursa (job #1386669)
#include <iostream>
#include <algorithm>
#include <cstdio>
#define inf 0x3f3f3f3f
using namespace std;
int n, m;
struct interval { int st, mid, dr; };
struct node
{
interval interv;
int mini;
node *st, *dr;
node(){}
node(int stanga, int dreapta)
{
interv.st = stanga;
interv.dr = dreapta;
mini = inf;
if (interv.st != interv.dr){
interv.mid = (interv.st + interv.dr) / 2;
this->st = new node(interv.st, interv.mid);
this->dr = new node(interv.mid + 1, interv.dr);
}
else {
this->st = new node();
this->dr = new node();
}
}
};
node *start;
int pos, val;
void update(node *x)
{
if (x->interv.st == x->interv.dr){
x->mini = val;
return;
}
if (pos <= x->interv.mid)
update(x->st);
else
update(x->dr);
x->mini = min(x->st->mini, x->dr->mini);
}
int minim;
interval intervalCitit;
void querry(node *x)
{
if (intervalCitit.st <= x->interv.st && x->interv.dr <= intervalCitit.dr){
minim = min(minim, x->mini);
return;
}
if (intervalCitit.st <= x->interv.mid)
querry(x->st);
if (x->interv.mid < intervalCitit.dr)
querry(x->dr);
}
int main()
{
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
int x, k, a, b;
scanf("%d %d\n", &n, &m);
start = new node(1, n);
for (int i = 1; i <= n; ++i){
scanf("%d ", &x);
pos = i;
val = x;
update(start);
}
for (int i = 1; i <= m; ++i){
scanf("%d %d\n", &a, &b);
/// querry
minim = inf;
intervalCitit.st = a;
intervalCitit.dr = b;
querry(start);
printf("%d\n", minim);
}
return 0;
}