Pagini recente » Cod sursa (job #1522609) | Cod sursa (job #693295) | Cod sursa (job #23630) | Cod sursa (job #1086817) | Cod sursa (job #254533)
Cod sursa(job #254533)
#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;
if (valoare(st,dr,x) > valoare(st,dr,x + 1))++x;
printf("%d %lld\n",st + x,valoare(st,dr,st + x));
}
return 0;
}