Pagini recente » Cod sursa (job #2875168) | Cod sursa (job #393987) | Cod sursa (job #1642998) | Cod sursa (job #2494768) | Cod sursa (job #1699487)
#include <iostream>
#include <algorithm>
#include <vector>
#include <fstream>
#include <cmath>
int Mat[100001][30];
int v[100001];
int main()
{
std::ifstream inf("rmq.in");
std::ofstream outf("rmq.out");
int N, M;
inf >> N >> M;
for(int i = 1; i <= N; i++)
{
inf >> v[i];
}
//Algoritmul RMQ
//Mat[i][j] = Mat[i][j-1] daca v[Mat[i][j-1]] <= v[Mat[i + 2 ^ (j-1)][j-1]]
// = Mat[i + 2 ^(j-1)][j-1] altfel
//conditii initiale
for(int i = 1; i <= N; i++)
Mat[i][0] = i;
for(int j = 1; (1 << j) <= N; j++)
for(int i = 1; i + (1 << j) -1 <= N; i++)
{
if(v[Mat[i][j-1]] <= v[Mat[i + (1<< (j-1))][j-1]])
Mat[i][j] = Mat[i][j-1];
else
Mat[i][j] = Mat[i+ (1<< (j - 1))][j-1];
}
for(int i = 0; i < M; i++)
{
int x, y;
inf >> x >> y;
int k = (int)log2((double)(y -x + 1));
if(v[Mat[x][k]] <= v[Mat[y - (1<< k) + 1][k]])
outf << v[Mat[x][k]] << "\n";
else
outf << v[Mat[y - (1 << k) + 1][k]] <<"\n";
}
inf.close();
outf.close();
return 0;
}