Pagini recente » Cod sursa (job #1006132) | Cod sursa (job #1967892)
#include <stdint.h>
#include <fstream>
#include <math.h>
#define nmax 100001
#define mmax 1000001
#define log2n 18
using namespace std;
fstream f1("rmq.in", ios::in);
fstream f2("rmq.out", ios::out);
int32_t n, m, a[nmax][log2n], v[nmax], put2[nmax];
int main()
{
int32_t i, var, l, r, j;
f1>>n>>m;
var=log2(n);
for(i=1; i<=n; i++)
f1>>v[i];
///a[i][j]= minimul pe intervalul care incepe la pozitia i si cuprinde 2^j elemente
put2[0]=1;
put2[1]=2;
for(i=2; i<=n; i++)
put2[i]=put2[i-1]<<1;
for(i=1; i<=n; i++)
a[i][0]=i;
for(j=1; j<=var; j++)
for(i=1; put2[j]+i-1<=n; i++)
if(v[a[i][j-1]]>v[a[put2[j-1]+i][j-1]]) a[i][j]=a[put2[j-1]+i][j-1];
else a[i][j]=a[i][j-1];
for(i=1; i<=m; i++)
{
f1>>l>>r;
j=log2(r-l+1);
if(v[a[l][j]]> v[a[r-put2[j]+1][j]]) f2<<v[a[r-put2[j]+1][j]];
else f2<<v[a[l][j]];
f2<<"\n";
}
return 0;
}