Pagini recente » Cod sursa (job #2264529) | Cod sursa (job #2891291) | Cod sursa (job #1507668) | Cod sursa (job #1886736) | Cod sursa (job #1749746)
#include <bits/stdc++.h>
using namespace std;
int d[17][100002],m,n,q;
ifstream f("rmq.in");
ofstream g("rmq.out");
int putere2(int n)//calculez 2^n
{
if(n==0)
return 1;
else
return 2*putere2(n-1);
}
int exponent(int n)//calculez x astfel incat 2^x<=n
{
int x=0,p=1;
while(p<n)
{
x++;
p<<=1;
}
if(p>n)
x--;
return x;
}
void afis()
{
int i,j;
for(i=0;i<=m;i++)
{
for(j=1;j<=n && d[i][j];j++)
cout<<d[i][j]<<" ";
cout<<'\n';
}
}
int rmq(int x,int y)
{
int k=exponent(y-x);
return min(d[k][x],d[k][y-putere2(k)+1]);
}
void constructie()
{
int i,j,dist;
f>>n>>q;
for(i=1;i<=n;i++)
f>>d[0][i];
m=exponent(n);
for(i=1;i<=m;i++)
{
dist=putere2(i-1);
for(j=1;j<=n-dist+1;j++)
d[i][j]=min(d[i-1][j],d[i-1][j+dist]);
}
//afis();
int x,y;
for(i=1;i<=q;i++)
{
f>>x>>y;
g<<rmq(x,y)<<'\n';
}
}
int main()
{
constructie();
return 0;
}