Cod sursa(job #1242522)
Utilizator | Boni Daniel Stefan refugiat | Data | 14 octombrie 2014 16:41:16 |
---|---|---|---|
Problema | Range minimum query | Scor | 30 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 0.63 kb |
#include <iostream>
#include <fstream>
#define DN 100005
using namespace std;
ifstream si("rmq.in");
ofstream so("rmq.out");
int rmq[DN][25];
int find(int a,int b)
{
int p=0;
for(;a+(1<<p)<=b;++p);
--p;
p=max(p,0);
return min(rmq[a][p],rmq[b-(1<<p)+1][p]);
}
int main()
{
int n,m;
si>>n>>m;
int i;
for(i=1;i<=n;++i)
si>>rmq[i][0];
int p;
for(p=1;p<=18;++p)
for(i=1;i+(1<<(p-1))<=n;++i)
rmq[i][p]=min(rmq[i][p-1],rmq[i+(1<<(p-1))][p-1]);
int a,b;
for(i=0;i<m;++i)
{
si>>a>>b;
so<<find(a,b)<<endl;
}
}