Pagini recente » Cod sursa (job #415923) | Cod sursa (job #62963) | Cod sursa (job #797243) | Cod sursa (job #1314704) | Cod sursa (job #2337857)
#include <iostream>
#include <fstream>
#include <cmath>
#define VAL_MAX 0x3f3f3f3f
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int n, m, initial_array[100005], root_array[320], size_root;
void citire()
{
int x, ind, ind_root=1;
f >> n >> m;
size_root=(int)sqrt(n);
int val_min=VAL_MAX;
for ( ind=1; ind<=n; ind++)
{
f >> initial_array[ind];
if (initial_array[ind]<val_min)
{
val_min=initial_array[ind];
}
if (ind%size_root==0)
{
root_array[ind_root++]=val_min;
val_min=VAL_MAX;
}
}
if (val_min!=VAL_MAX)
root_array[ind_root++]=val_min;
/* for (int i=1; i<ind_root; ++i)
{
cout << root_array[i] <<'\n';
}*/
}
int find_min (int st, int dr)
{
int mini=VAL_MAX;
while (dr%size_root!=0 && st<=dr)
{
mini=min(mini,initial_array[dr]);
dr--;
}
while (st+size_root<=dr && dr%size_root==0)
{
mini=min(mini,root_array[dr/size_root]);
dr-=size_root;
}
while (st<=dr)
{
mini=min(mini,initial_array[dr]);
dr--;
}
return mini;
}
void solve()
{
int st, dr;
for (int query=0; query<m; ++query)
{
f >> st >> dr;
g << find_min(st,dr) << '\n';
}
}
int main() {
citire();
solve();
return 0;
}