Pagini recente » Cod sursa (job #267349) | Cod sursa (job #2366252) | Cod sursa (job #2508042) | Cod sursa (job #150510) | Cod sursa (job #2895915)
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
int v[100100], bucketMinPoz[100100][20], k, i, j, n, m, x, y, p; //retinem poz minimului din v in bucketul actual
void creeazaBucketuri()
{
for(i = 0; i < n ; i++)
bucketMinPoz[i][0] = i;
for(j = 1; (1 << j) <= n; j++)
for(i = 0; i + (1 << j) - 1 < n; i++)
if(v[bucketMinPoz[i][j - 1]] < v[bucketMinPoz[i + (1 << (j - 1))][j - 1]])
bucketMinPoz[i][j] = bucketMinPoz[i][j - 1];
else
bucketMinPoz[i][j] = bucketMinPoz[i + (1 << (j - 1))][j - 1];
}
int main()
{
in>>n>>m;
for(i = 0; i < n; i++)
in>>v[i];
creeazaBucketuri();
for(i = 1; i <= m; i++)
{
in>>x>>y;
p = 1;
k = 0;
while(p * 2 <= y - x + 1) //k = log(j - i + 1)
{
p *= 2;
k++;
}
if(v[bucketMinPoz[x - 1][k]] <= v[bucketMinPoz[y - p][k]])
out<<v[bucketMinPoz[x - 1][k]]<<'\n';
else
out<<v[bucketMinPoz[y - p][k]]<<'\n';
}
return 0;
}