#include <cstdio>
int arb[400050], N, M, val, poz, maxim, s, f, fr[400050], pp, v[250005];
int max(int x, int y) {return x > y ? x : y;}
void update(int nod, int st, int dr)
{
if (st == dr)
{
arb[nod] = val;
fr[nod] = st;
return;
}
int mij = (st + dr) / 2;
if (poz <= mij) update(2 * nod, st, mij);
else update(2 * nod + 1, mij + 1, dr);
arb[nod] = max(arb[2*nod], arb[2*nod+1]);
if (arb[nod] == arb[2 * nod]) fr[nod] = fr[2 * nod];
else fr[nod] = fr[2 * nod + 1];
}
void query(int nod, int st, int dr)
{
if (s <= st && dr <= f)
{
if (maxim < arb[nod])
{
maxim = arb[nod];
pp = fr[nod];
}
return;
}
int mij = (st + dr) / 2;
if (s <= mij) query(2 * nod, st, mij);
if (mij < f) query(2 * nod + 1, mij + 1, dr);
}
int ab(int x) { return x > 0 ? x : (-x);}
void citire()
{
freopen("cuburi2.in","r",stdin);
freopen("cuburi2.out","w",stdout);
int i;
scanf("%d %d",&N, &M);
for (i = 1; i <= N; i++)
{
scanf("%d",&v[i]);
poz = i;
val = v[i];
update(1,1,N);
}
}
void arbori()
{
int i, j, a, b;
long long nr;
for (i = 1; i <= M; i++)
{
scanf("%d %d",&a,&b);
maxim = -1;
s = a; f = b;
query(1,1,N);
nr = 0;
for (j = a; j <= b; j++) nr += (v[j] * ab(pp - j));
printf("%d %lld\n",pp, nr);
}
}
void brut()
{
int i, j, a, b, k;
long long nr, minim;
for (i = 1; i <= M; i++)
{
scanf("%d %d",&a,&b);
minim = (1<<59);
for (j = a; j <= b; j++)
{
nr = 0;
for (k = a; k <= b; k++) nr += (v[k] * ab(j - k));
if (nr < minim)
{
minim = nr;
pp = j;
}
}
printf("%d %lld\n",pp,minim);
}
}
int main()
{
citire();
if (N > 5000) arbori();
else brut();
return 0;
}