Pagini recente » trasee2 | Concursuri Virtuale | Metro | Monitorul de evaluare | Cod sursa (job #2019993)
#include <fstream>
#define MAX 100005
using namespace std;
ifstream fi("rmq.in");
ofstream fo("rmq.out");
int a[MAX],minim[MAX][20],n,m;
///minim[x][p]=minimul de la pozitia x la x+2^p
void precalculare()
{
for (int x=1; x<n; x++)
minim[x][0]=min(a[x],a[x+1]);
for (int p=1; (1<<p)<=n; p++)
for (int x=1; x+(1<<p)<=n; x++)
minim[x][p]=min(minim[x][p-1],
minim[x+(1<<(p-1))][p-1]);
}
int main()
{
fi>>n>>m;
for (int i=1; i<=n; i++)
fi>>a[i];
precalculare();
/*for (int i=1; i<=n; i++)
for (int p=0; i+(1<<p)<=n; p++)
{
fo<<"Minimul de la "<<i<<" la "<<i+(1<<p)<<" este ";
fo<<minim[i][p]<<"\n";
}*/
for (int i=1; i<=m; i++)
{
int x,y;
fi>>x>>y;
if (x==y)
{fo<<a[x]<<"\n"; continue;}
int p=0;
while (x+(1<<(p+1))<=y)
p++;
int rez=min(minim[x][p],
minim[y-(1<<p)][p]);
fo<<rez<<"\n";
}
fi.close();
fo.close();
return 0;
}