Pagini recente » Cod sursa (job #2424936) | Cod sursa (job #1873286) | Cod sursa (job #2866144) | Cod sursa (job #2972685) | Cod sursa (job #3288720)
#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> rmq;
int lg[100000]; //logaritmul fiecarui numar de la 1 la n
int main()
{
ifstream cin("rmq.in");
ofstream cout("rmq.out");
int n, m;
cin >> n >> m;
rmq.resize(20);
rmq[0].resize(n);
for(int i=0; i<n; i++)
{
cin >> rmq[0][i]; //citim elementele vectorului in primul nivel al rmq-ului
}
for(int e=1; (1<<e)<n; e++) //calculam structura de date rmq
{
for(int i=(1<<e); i<(1<<(e+1)) && i<n; i++) //calculam logaritmul fiecarui numar de la 2^e la 2^(e+1)
lg[i]=e;
rmq[e].resize(rmq[e-1].size()-e); //calculam nivelul e al rmq-ului
for(int i=0; i<rmq[e].size(); i++)
{
rmq[e][i]=min(rmq[e-1][i], rmq[e-1][i+(1<<(e-1))]);
}
}
for(int i=0; i<m; i++)
{
int x, y;
cin >> x >> y; //citim capetele intervalului
x--; y--; //incepem indexarea de la 0
int exponent=lg[y-x+1];
int minim=min(rmq[exponent][x], rmq[exponent][y-(1<<exponent)+1]);
cout << minim << "\n";
}
return 0;
}