Pagini recente » Cod sursa (job #838057) | Cod sursa (job #2387808) | Cod sursa (job #1088927) | Cod sursa (job #2641283) | Cod sursa (job #2512101)
#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>
using namespace std;
ifstream in ("rmq.in");
ofstream out("rmq.out");
//int mm[10000][1000];
vector <int> a;
vector < vector <int> > mm;
vector <int> dummy;
int n, m;
int x1, x2;
int loga(int x)
{
if(x==1)
return 0;
return loga(x/2)+1;
}
void preproc()
{
dummy.resize(loga(n)+1, 0);
mm.resize(n+2, dummy);
for(int i=0; i<n; i++)
mm[i][0]=a[i];
for(int put=1; (1<<put)<=n; put++)
{
for(int i=0; i+(1<<put)-1<n; i++)
{
mm[i][put]=min(mm[i][put-1], mm[i+(1<<(put-1))][put-1]);
}
}
}
int rmq(int x1, int x2)
{
int poz=(int)loga(x2-x1+1);
return min(mm[x1][poz], mm[x2-(1<<poz)+1][poz]);
}
int main()
{
in>>n>>m;
a.resize(n+1);
for(int i=0; i<n; i++)
in>>a[i];
preproc();
for(int i=1; i<=m; i++)
{
in>>x1>>x2;
out<<rmq(x1-1, x2-1)<<"\n";
}
return 0;
}