Pagini recente » Cod sursa (job #2845725) | Cod sursa (job #1723107) | Cod sursa (job #1019814) | Cod sursa (job #2917636) | Cod sursa (job #1698848)
#include<cstdio>
#include<cmath>
using namespace std;
#define DIM 10000
char buff[DIM];
int poz=0;
void citeste(int &numar)
{
numar = 0;
//cat timp caracterul din buffer nu e cifra ignor
while (buff[poz] < '0' || buff[poz] > '9')
//daca am "golit" bufferul atunci il umplu
if (++poz == DIM)
fread(buff,1,DIM,stdin),poz=0;
//cat timp dau de o cifra recalculez numarul
while ('0'<=buff[poz] && buff[poz]<='9')
{
numar = numar*10 + buff[poz] - '0';
if (++poz == DIM)
fread(buff,1,DIM,stdin),poz=0;
}
}
int n,v[100023],bucata[100023];
int min(int a,int b)
{
if(a<b) return a;
return b;
}
int main()
{
freopen ("rmq.in","r",stdin);
freopen ("rmq.out","w",stdout);
int m;
citeste(n),citeste(m);
for(int i=1;i<=n;i++) bucata[i]=1000000000;
for(int i=1;i<=n;i++) citeste(v[i]);
int buc=1,mar=sqrt(n);
for(int i=1;i<=n;i++)
{
if((i-1)%mar==0&&i!=1) ++buc;
bucata[buc]=min(bucata[buc],v[i]);
}
for(int i=1;i<=m;i++)
{
int a,b,sum=1000000000;
citeste(a),citeste(b);
for(int j=a;j<=b;j++)
{
if((j-1)%mar==0&&j+mar<=b&&j!=1)
{
sum=min(sum,bucata[(j-1)/mar +1]);
j+=mar-1;
}
else sum=min(sum,v[j]);
}
printf("\n%d\n",sum);
}
}