Pagini recente » Cod sursa (job #22407) | Cod sursa (job #2733581) | Cod sursa (job #1437143) | Cod sursa (job #182963) | Cod sursa (job #2394077)
#include <fstream>
#include <deque>
#include <iostream>
using namespace std;
ifstream fin("buline.in");
ofstream fout("buline.out");
int n,i,x,v[400001],sol,l,p,sum,st,dr,S;
int main(){
fin>>n;
sol=-1000001; p=-1; l=1;
for(i=1;i<=n;i++){
fin>>v[i]>>x;
if(x==0)
v[i]=-v[i];
if(sol<v[i]){
sol=v[i];
p=i;
}
v[i+n]=v[i];
S+=v[i];
cout<<v[i]<<" ";
}
cout<<"\n";
st=1;
dr=1;
sum=v[1];
if(sol<sum){
sol=sum;
p=st;
l=dr-st+1;
}else
if(sol==sum && p>st){
p=st;
l=dr-st+1;
}
///subsecv de s maxima
for(i=2;i<=n;i++){
while(dr-st>=n-1){
sum-=v[st];
st++;
}
if(v[i]>sum+v[i]){
st=i;
dr=i;
sum=v[i];
}else{
sum+=v[i];
dr++;
}
if(sol<sum){
sol=sum;
p=st;
l=dr-st+1;
}else
if(sol==sum && p>st){
p=st;
l=dr-st+1;
}
}
///subsecv de suma min
for(i=2;i<=n;i++){
while(dr-st>=n-1){
sum-=v[st];
st++;
}
if(v[i]<sum+v[i]){
st=i;
dr=i;
sum=v[i];
}else{
sum+=v[i];
dr++;
}
if(sol<S-sum){
sol=S-sum;
p=dr+1;
l=n-dr+st-1;
}else
if(sol==S-sum){
p=dr+1;
l=n-dr+st-1;
}
}
if(p>n)
p-=n;
fout<<sol<<" "<<p<<" "<<l;
return 0;
}