Pagini recente » Cod sursa (job #1597639) | Cod sursa (job #1762546) | Cod sursa (job #2379069) | Cod sursa (job #1621169) | Cod sursa (job #1738640)
#include<bits/stdc++.h>
#define INF LLONG_MAX
#define maxN 400005
using namespace std;
deque<int> q;
int n,x,c,v[maxN],ls,ld,imin,m[maxN];
long long maxim=-INF,s[maxN];
int main()
{
freopen("buline.in","r",stdin);
freopen("buline.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x,&c);
if (c) v[i]=x;
else v[i]=-x;
}
for(int i=n+1;i<=2*n;i++)
{
v[i]=v[i-n];
}
s[0]=0;
m[0]=0;
for(int i=1;i<=(2*n);i++) s[i]=s[i-1]+v[i];
for(int i=1;i<=n;i++)
{
if (s[i]<s[m[i-1]])
{
m[i]=i;
}
else m[i]=m[i-1];
}
for(int i=1;i<=(2*n);i++)
{
while (!q.empty() && s[q.back()]>=s[i])
{
q.pop_back();
}
q.push_back(i);
while (q.front()<=(i-n)) q.pop_front();
if (i>n)
{
m[i]=q.front();
}
}
for(int i=1;i<=(2*n);i++)
{
if ((s[i]-s[m[i-1]])>maxim)
{
maxim=s[i]-s[m[i-1]];
ls=m[i-1]+1;
ld=i;
}
}
int y=ld-ls+1;
printf("%lld %d %d\n",maxim,ls,y);
return 0;
}