Pagini recente » Cod sursa (job #3125372) | Cod sursa (job #37060) | Cod sursa (job #448499) | Cod sursa (job #2899062) | Cod sursa (job #1811780)
#include <fstream>
using namespace std;
ofstream out("rmq.out");
ifstream in("rmq.in");
const int N_MAX = 100000;
int v[1 + 5*N_MAX];
int n;
int min(int a, int b)
{
if(a==0) return b;
if(b==0) return a;
return (a<b)?a:b;
}
int vec[22][5*N_MAX];
int po2(int x)
{
if(x==0) return 1;
if(x%2==1) return 2*po2(x-1);
if(x%2==0){int a2 = po2(x/2); return a2*a2;}
}
int log2(int n)
{
int i;
for(i=2; n/i>=1; i++);
i--;
return i;
}
void calc()
{
int cap = log2(n);
for(int j=1; j<=n; j++)
vec[1][j] = min(v[j],v[j+1]);
for(int j=2; j<=cap; j++)
{
int r = po2(j-1);
for(int k=1; k <= n-r+1; k++)
{
vec[j][k] = min(vec[j-1][k], vec[j-1][k+r]);
}
}
}
int rmq(int p, int q)
{
int i, l;
int t = q - p + 1;
for(i=1, l=0; i<=t; i*=2, l++);
i/=2; l--;
return min(vec[l][p], vec[l][q-i+1]);
}
int main()
{
int m;
in >> n >> m;
for(int i=1; i<=n; i++)
in >> v[i];
calc();
for(int i=1; i<=m; i++)
{
int p,q;
in >> p >> q;
out << rmq(p,q) << "\n";
}
return 0;
}