Pagini recente » Cod sursa (job #454128) | Cod sursa (job #1694709) | Cod sursa (job #2443650) | Cod sursa (job #1427126) | Cod sursa (job #2490980)
#include<bits/stdc++.h>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
int values[100000],n,m;
int lookup[100000][21];
int logx2[20];
void read()
{
in>>n>>m;
for(int i=0; i<n; i++)
in>>values[i];
}
void logarithm_table()
{
logx2[0]=1;
for(int i=1; i<=20; i++)
{
logx2[i]=2*logx2[i-1];
}
}
void create_lookup()
{
for(int i=0; 1<<i <=n; i++)
{
int pp=1<<i,last=1<<(i-1);
for(int k=0; k<=n-pp; k++)
{
if(i==0)
{
lookup[k][i]=values[k];
}
else
{
lookup[k][i]=min(lookup[k][i-1],lookup[k+last][i-1]);
}
}
}
}
int get_minimum_interval(int a,int b)
{
int result=9999999;
int index=20;
while(index>=0)
{
if(logx2[index]<=(b-a))
{
result=min(result,lookup[a][index]);
a+=logx2[index];
}
if(a==b)
{
result=min(result,values[a]);
break;
}
index--;
}
return result;
}
void solve()
{
int a,b;
for(int i=0; i<m; i++)
{
in>>a>>b;
out<<get_minimum_interval(a-1,b-1)<<'\n';
}
}
int main()
{
logarithm_table();
read();
create_lookup();
solve();
return 0;
}