Pagini recente » Cod sursa (job #1128495) | Cod sursa (job #1072707) | Cod sursa (job #2681207) | Cod sursa (job #3304798) | Cod sursa (job #3304794)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("buline.in");
ofstream fout("buline.out");
int n, v[400010];
int main()
{
fin >> n;
for(int i=1; i<=n; i++) {
int x, color; fin >> x >> color;
if(color == 0) v[i] = v[i + n] = -x;
else v[i] = v[i + n] = x;
}
int sumMax = v[1], poz = 1, lung = 1;
int sumCurent = v[1], st = 1;
for(int i=2; i<=2*n; i++) {
if(sumCurent + v[i] > v[i]) sumCurent += v[i];
else sumCurent = v[i], st = i;
if(sumCurent > sumMax) sumMax = sumCurent, poz = st, lung = i - st + 1;
else if(sumCurent == sumMax) {
if(st < poz) poz = st, lung = i - st + 1;
else if(st == poz && i - st + 1 < lung) lung = i - st + 1;
}
if(st > n) break;
if(i - st + 1 == n) {
int dr = i;
while(v[st] < 0 && st <= dr) sumCurent -= v[st++];
while(v[dr] < 0 && st <= dr) sumCurent -= v[dr--];
if(sumCurent > sumMax) sumMax = sumCurent, poz = st, lung = dr - st + 1;
else if(sumCurent == sumMax) {
if(st < poz) poz = st, lung = dr - st + 1;
else if(st == poz && dr - st + 1 < lung) lung = dr - st + 1;
}
break;
}
}
fout << sumMax << " " << poz << " " << lung;
return 0;
}