Pagini recente » Cod sursa (job #785390) | Cod sursa (job #2524409) | Utilizatori inregistrati la Concursul Mihai Patrascu 2013 | Cod sursa (job #2464141) | Cod sursa (job #3037616)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int a[100001],n,t,i,x,y,minim[1001];
int j,lg,radical,cat,rest,nr_int,nr_int1,nr_int2,raspuns;
int main()
{
fin>>n>>t;
for(i=1;i<=n;i++)
fin>>a[i];
radical=0;
while(radical*radical<=n)
{
radical++;
}
radical--;
lg=radical;
// 1..lg
// lg+1..2*lg
//intervalul j:(j-1)*lg+1...j*lg
for(j=1;j*lg<=n;j++)
{
minim[j]=a[(j-1)*lg+1];
for(i=(j-1)*lg+2;i<=j*lg;i++)
if(a[i]<minim[j])
minim[j]=a[i];
}
j--;
if(j*lg<n)
{
j++;
minim[j]=a[(j-1)*lg+1];
for(i=(j-1)*lg+2;i<=n;i++)
if(a[i]<minim[j])
minim[j]=a[i];
}
nr_int=j;
// fin>>t;
for(i=1;i<=t;i++)
{
fin>>x>>y;
if(y-x+1<lg)
{
raspuns=a[x];
for(j=x+1;j<=y;j++)
if(a[j]<raspuns)
raspuns=a[j];
}
else
{
//caut primul capat stanga mai mare sau egal ca x
cat=x/lg;
rest=x%lg;
if(rest!=0) nr_int1=cat+2;
else nr_int1=cat+1;
//caut ultimul capat dreapta <=y
cat=y/lg;
rest=y%lg;
nr_int2=cat;
// if(x==5&&y==9)
// cout<<nr_int1<<" "<<nr_int2;
if(nr_int1<=nr_int2)
{
raspuns=a[x];
for(j=x+1;j<=(nr_int1*lg);j++)
if(a[j]<raspuns)
raspuns=a[j];
for(j=nr_int2*lg+1;j<=y;j++)
if(a[j]<raspuns)
raspuns=a[j];
for(j=nr_int1;j<=nr_int2;j++)
if(minim[j]<raspuns)
raspuns=a[j];
}
else
{
raspuns=a[x];
for(j=x+1;j<=y;j++)
if(a[j]<raspuns)
raspuns=a[j];
}
}
fout<<raspuns<<'\n';
}
return 0;
}