Pagini recente » Cod sursa (job #1231034) | Cod sursa (job #1663609) | Cod sursa (job #2173074) | Cod sursa (job #1485069) | Cod sursa (job #2445769)
#include<bits/stdc++.h>
#define nmax 100000
#define log2nmax 17
using namespace std;
int lookup[nmax][log2nmax];
//lookup[i][j]=indicele valori minime din intervalul i...i+2^j-1
void preprocess(int arr[],int n)
{
int i,j;
//initializare
for(i=0;i<n;i++)
lookup[i][0]=i;
for(j=1;(1<<j)<n;j++)
for(i=0;i+(1<<j)-1<n;i++)
if(arr[lookup[i][j-1]]<=arr[lookup[i+(1<<(j-1))][j-1]])
lookup[i][j]=lookup[i][j-1];
else
lookup[i][j]=lookup[i+(1<<(j-1))][j-1];
}
int query(int l,int r,int arr[])
{
int dim=(int)log2(r-l+1);
if(arr[lookup[l][dim]]<=arr[lookup[r-(1<<dim)+1][dim]])
return arr[lookup[l][dim]];
else
return arr[lookup[r-(1<<dim)+1][dim]];
}
int main()
{
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n,arr[nmax],i,m,a,b;
fin>>n>>m;
for(i=0;i<n;i++)
fin>>arr[i];
preprocess(arr,n);
for(i=1;i<=m;i++)
{
fin>>a>>b;
fout<<query(a-1,b-1,arr)<<'\n';
}
fin.close();
fout.close();
}