Pagini recente » Cod sursa (job #1937144) | Cod sursa (job #649232) | Cod sursa (job #1134149) | Cod sursa (job #1929928) | Cod sursa (job #254525)
Cod sursa(job #254525)
#include<stdio.h>
const int maxn = 300000;
long long S[maxn],V[maxn],SC[maxn];
int N,M;
long long calc(int st,int dr,int poz)
{
if (st > dr) return 0;
return (long long)(SC[dr] - SC[st - 1]) - (long long)poz * (S[dr] - S[st - 1]);
}
long long valoare(int st,int dr,int poz)
{
return (long long)calc(poz + 1,dr,poz) - calc(st,poz - 1,poz);
}
int main()
{
freopen("cuburi2.in","r",stdin);
freopen("cuburi2.out","w",stdout);
scanf("%d %d\n",&N,&M);
for(int i = 1;i <= N; ++i)
scanf("%lld ",&V[i]);
for(int i = 1;i <= N; ++i)
S[i] = S[i - 1] + V[i];
for(int i = 1;i <= N; ++i)
SC[i] = SC[i - 1] + V[i] * i;
/* for(int i = 1;i <= N; ++i)printf("%lld ",S[i]);
printf("\n");*/
for(int i = 1;i <= M; ++i)
{
int st,dr;
scanf("%d %d\n",&st,&dr);
if (st > dr) {int aux = st;st = dr;dr = aux;}
int x = 0,p = 0;
for(p = 1;p <= dr - st; p <<= 1);
for(;p;p >>= 1)
if (st + x + p <= dr && valoare(st,dr,st + x + p) > valoare(st,dr,st + x + p + 1)) x += p;
++x;
printf("%d %lld\n",st + x,valoare(st,dr,st + x));
}
return 0;
}