Pagini recente » Monitorul de evaluare | Cod sursa (job #342246) | Cod sursa (job #2027468) | Cod sursa (job #1182289) | Cod sursa (job #2345949)
#include <fstream>
#define NMAX 100005
using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
int Arbore[4 * NMAX], minn;
void UpdateArb(int nod, int val, int st, int dr, int poz){
if(st == dr){
Arbore[nod] = val;
return;
}
int mij = (st + dr) / 2;
if(poz <= mij)
UpdateArb(2* nod, val, st, mij, poz);
else UpdateArb(2 * nod + 1, val, mij + 1, dr, poz);
Arbore[nod] = min(Arbore[nod * 2], Arbore[nod * 2 + 1]);
}
void Query(int nod, int st, int dr, int stanga, int dreapta){
if(stanga <= st && dr <= dreapta){
if(Arbore[nod] < minn)
minn = Arbore[nod];
return;
}
int mij = (st + dr) / 2;
if(stanga < mij)
Query(2 * nod, st, mij, stanga, dreapta);
if(mij < dreapta)
Query(2 * nod + 1, mij + 1, dr, stanga, dreapta);
}
int main()
{
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; ++i){
int x;
cin >> x;
UpdateArb(1, x, 1, n, i);
}
for(int i = 1; i <= m; ++i){
int x, y;
cin >> x >> y;
minn = (1 << 30);
Query(1, 1, n, x, y);
cout << minn << '\n';
}
return 0;
}