Pagini recente » Cod sursa (job #1400890) | Cod sursa (job #157005) | Cod sursa (job #1108440) | Cod sursa (job #199875) | Cod sursa (job #2136554)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
#define nmax 100005
ifstream f("rmq.in");
ofstream g("rmq.out");
vector<pair<int,int>>queries;
int value[nmax],n,m,logg;
int v[nmax][16];
void read()
{
f>>n>>m;
for (int i=1;i<=n;++i)
f>>value[i];
for (int i=1;i<=m;++i)
{
int a,b;
f>>a>>b;
queries.push_back({a,b});
}
}
int getlogg(int nod)
{
int temp,calcul=0;
for (temp=1;temp<=nod;temp<<=1,++calcul);
return calcul-1;
}
void solve()
{
logg=getlogg(n);
for (int i=1;i<=n;++i)
v[i][0]=i;
for (int j=1;j<=logg;++j)
for (int i=1;i+(1<<j)-1<=n;++i)
if (value[v[i+(1<<(j-1))][j-1]]<value[v[i][j-1]])
v[i][j]=v[i+(1<<(j-1))][j-1];
else
v[i][j]=v[i][j-1];
for (auto w:queries)
{
int x=w.first;
int y=w.second;
if (x>y)
swap(x,y);
int loga=getlogg(y-x+1);
int mn=min(value[v[x][loga]],value[v[y-(1<<loga)+1][loga]]);
g<<mn<<'\n';
}
}
int main()
{
read();
solve();
return 0;
}