Pagini recente » Cod sursa (job #1088945) | Cod sursa (job #342308) | Cod sursa (job #2454090) | Cod sursa (job #590344) | Cod sursa (job #403909)
Cod sursa(job #403909)
#include<iostream>
#include<string>
using namespace std;
#define NM 250005
#define LL long long
int N,M;
int A[NM];
LL UL[NM],UR[NM],TL[NM],TR[NM];
inline LL retsum(int x,int y,int t)
{
LL ans=0;
ans+=(TL[t]-TL[x-1]-UL[x-1]*(t-x+1));
ans+=(TR[t]-TR[y+1]-UR[y+1]*(y-t+1));
return ans;
}
int main()
{
int x,y;
freopen("cuburi2.in","r",stdin);
freopen("cuburi2.out","w",stdout);
scanf("%d %d",&N,&M);
for(int i=1;i<=N;++i)
scanf("%d",&A[i]);
for(int i=1;i<=N;++i)
UL[i]=UL[i-1]+A[i];
for(int i=N;i>=1;--i)
UR[i]=UR[i+1]+A[i];
for(int i=1;i<=N;++i)
TL[i]=TL[i-1]+UL[i-1];
for(int i=N;i>=1;--i)
TR[i]=TR[i+1]+UR[i+1];
for(int i=1;i<=M;++i)
{
scanf("%d %d",&x,&y);
LL best=retsum(x,y,x);
int pos=x;
int st=x,dr=y;
while((dr-st)>3)
{
int lt=(2*st+dr)/3;
int rt=(st+2*dr)/3;
LL lv=retsum(x,y,lt);
LL rv=retsum(x,y,rt);
if(lv<rv) dr=rt;
else st=lt;
}
/*
for(int j=x;j<=y;++j)
printf("%I64d ",retsum(x,y,j));
*/
for(int j=st;j<=dr;++j)
{
LL cur=retsum(x,y,j);
if(cur<best)
{
best=cur;
pos=j;
}
}
printf("%d %lld",pos,best);
printf("\n");
}
return 0;
}