Pagini recente » Cod sursa (job #1613018) | Cod sursa (job #762310) | Cod sursa (job #1968179) | Cod sursa (job #673581) | Cod sursa (job #2713437)
#include <bits/stdc++.h>
#define lim 100005
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
int n, m, mat[18][lim], v[lim], until;
void read()
{
in>>n>>m;
for(int i=1; i<=n; ++i)
{
in>>v[i];
}
}
void create_sparse_table()
{
int pw=1;
mat[0][0]=1;
for(int i=1; i<=18; ++i)
{
pw=pw*2;
mat[i][0]=pw;
if(pw>n)
{
until=i-1;
break;
}
}
for(int i=0; i<=until; ++i)
{
for(int j=1; (j+mat[i][0]-1)<=n; j++)
{
if(i==0)
{
mat[i][j]=v[j];
}
else
{
mat[i][j]=min(mat[i-1][j], mat[i-1][j+mat[i-1][0]]);
}
//cout<<mat[i][j]<<" ";
}
//cout<<'\n'<<'\n'<<'\n';
}
/*for(int i=0; i<=until; ++i)
{
for(int j=0; j<=n; ++j)
{
cout<<mat[i][j]<<" ";
}
cout<<'\n';
}*/
}
int find_pow(int x)
{
int a=1;
for(int i=0; i<=18; ++i)
{
if(a>x)
return i-1;
a=a*2;
}
}
void solve()
{
int x, y;
for(int i=1; i<=m; ++i)
{
in>>x>>y;
int lin=find_pow(y-x+1);
out<<min(mat[lin][x],mat[lin][y-mat[lin][0]+1])<<'\n';
}
}
int main()
{
read();
create_sparse_table();
solve();
return 0;
}