Pagini recente » Cod sursa (job #2207737) | Cod sursa (job #2720416) | Cod sursa (job #2337449) | Cod sursa (job #2355410) | Cod sursa (job #749604)
Cod sursa(job #749604)
#include <cstdio>
using namespace std;
#define Nmax 250011
#define Sums(mid,st,dr) ( Sum[mid] - Sts[st-1] - Drs[dr+1] )
#define Const(point) Sums(point,x,y)
int N,M;
int A[Nmax],Sum[Nmax],S[Nmax];
int Sts[Nmax],Drs[Nmax];
int x,y,P;
/*int BinFire(int St,int Dr)
{
if ( St==Dr )
return St;
if ( Dr-St==1 )
{
if ( Const(Dr) < Const(St) )
return Dr;
else
return St;
}
int Mid=(St+Dr)/2;
if ( Sums(Mid,St,Mid) - Sums(Mid,Mid,Dr) > 0 )
return BinFire(St,Mid);
return BinFire(Mid,Dr);
}*/
int main()
{
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)
S[i]=S[i-1]+A[i];
for (int i=1;i<=N;++i)
Sts[i]=(Sts[i-1]+S[i-1])+A[i];
for (int i=N;i;--i)
S[i]=S[i+1]+A[i];
for (int i=N;i;--i)
Drs[i]=(Drs[i+1]+S[i+1])+A[i];
for (int i=1;i<=N;++i)
S[i]=S[i-1]+A[i];
for (int i=1;i<=N;++i)
Sum[i]=Sts[i-1]+Drs[i+1];
for (;M;--M)
{
scanf("%d%d",&x,&y);
P = x;
int front=x, back=y , middle=0 ;
while (front <= back)
{
middle = (front + back) / 2;
if (S[middle-1] - S[x-1] < S[y] - S[middle-1])
{
front = middle + 1;
P = middle;
}
else back = middle - 1;
}
printf("%d %d\n",P,Const(P));
}
}