Cod sursa(job #1337344)

Utilizator akaprosAna Kapros akapros Data 8 februarie 2015 21:35:49
Problema Buline Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<deque>
#define Nmax 400005
#define Inf 2000000000
using namespace std;
deque < int >e;
int n,i,j,sol,p,q,nr,v[Nmax*2],s[2*Nmax];
int main()
{
    freopen("buline.in","r",stdin);
    freopen("buline.out","w",stdout);
    scanf("%d",&n); sol=-Inf;
    for (i=1;i<=n;i++)
    {
        scanf("%d %d",&v[i],&p);
        if (p==0) v[i]=-v[i];
    }
    p=0;
    for (i=1;i<n;i++) v[i+n]=v[i];
    for (i=1;i<=2*n-1;i++)
    {
        s[i]=s[i-1]+v[i];
        while ((!e.empty())&&(s[e.back()]>s[i]))
        e.pop_back();
        e.push_back(i);
        while (!e.empty() && i-e.front()>n)
        e.pop_front();
        if (e.empty()) e.push_back(0);
        while (!e.empty() && i-e.front()>n)
        e.pop_front();
        if (e.empty()) continue;
        if (s[e.front()]>0)
        {
            if (s[i]>=sol)
            sol=s[i],p=1,q=i;
            continue;
        }
        if (s[i]-s[e.front()]>=sol)
        sol=s[i]-s[e.front()],p=e.front()+1,q=i-e.front();
    }
    printf("%d %d %d",sol,p,q);
    return 0;
}