Pagini recente » Cod sursa (job #2098637) | Cod sursa (job #3174893) | Cod sursa (job #283853) | Cod sursa (job #2426664) | Cod sursa (job #2469042)
#include <bits/stdc++.h>
#define Dmax 17
using namespace std;
ifstream fin ("rmq.in");
ofstream fout ("rmq.out");
struct cv
{
int l[Dmax];
};
vector < cv > o;
vector < int > v;
int n,q;
void citesc ();
void rmq ();
int main()
{
citesc();
}
void citesc ()
{
int x, i1 ,i2, k, lg;
fin >> n >> q;
v.reserve(n+5);
o.reserve(n+5);
for ( int i = 1 ; i <= n; i++)
{
fin >> x;
v.push_back (x) ;
}
rmq () ;
int c1,c2, *p=v.data();
for ( int i =1 ; i <= q; i++)
{
fin>> i1 >> i2 ;
lg = (i2 - i1) +1 ;
i1-- ;
i2--;
k = int ( log2 (lg) );
c1 = o[i1].l[k];
c2 = o[i1+lg- (1 << k)].l[k];
fout << min(v[c1],v[c2]) << '\n' ;
}
fin.close();
}
void rmq ()
{
int x,y;
for ( int i = 0; i < n; i++ )
o[i].l[0] = i;
for ( int j = 1; (1<<j) <= n; j++ )
{
for ( int i = 0; i + (1<<j)-1 < n; i++ )
{
x = o[i].l[j-1];
y= o[ i+ (1<<(j-1)) ].l[ j-1 ] ;
if ( v[ x ] < v[ y ] )
o[i].l[j] = x;
else o[i].l[j] = y;
}
}
}