Pagini recente » Cod sursa (job #2912463) | Cod sursa (job #1531746) | Cod sursa (job #2912455) | Istoria paginii utilizator/xxspeedyxxro | Cod sursa (job #2189745)
#include <bits/stdc++.h>
#define N 100002
using namespace std;
int n, m;
int v[N], h[2*N];
void initialize(int nod, int start, int finish)
{
if(start==finish)
{
h[nod]=start;
}
else
{
int mid=(start+finish)/2;
initialize(nod*2,start,mid);
initialize(nod*2+1,mid+1,finish);
if(v[h[nod*2]] <= v[h[nod*2+1]])
{
h[nod]=h[nod*2];
}
else
{
h[nod]=h[nod*2+1];
}
}
}
int query(int nod, int start, int finish, int p, int q)
{
if(finish<p || q<start) return -1;
if(p<=start && finish<=q) return h[nod];
int mid, pos1, pos2;
mid=(start+finish)/2;
pos1=query(2*nod, start, mid, p, q);
pos2=query(2*nod+1, mid+1, finish, p, q);
if(pos1 == -1)
{
return pos2;
}
if(pos2 == -1)
{
return pos1;
}
if(v[pos1] <= v[pos2])
{
return pos1;
}
else
{
return pos2;
}
}
int main()
{
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int p1, p2;
fin>>n>>m;
for(int i=1; i<=n; i++)
{
fin>>v[i];
}
v[0]=100002;
initialize(1,1,n);
for(int i=1; i<=m; i++)
{
fin>>p1>>p2;
fout<<v[query(1,1,n,p1,p2)]<<'\n';
}
return 0;
}