Pagini recente » Cod sursa (job #584221) | Cod sursa (job #1128495) | Cod sursa (job #1072707) | Cod sursa (job #2681207) | Cod sursa (job #3304798)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("buline.in");
ofstream fout("buline.out");
int n, v[200010];
struct Iris {
int sum, poz, lung;
Iris(int x) { sum = x; }
};
inline int mod(int x) {
x = x % n;
if(x == 0) x = n;
return x;
}
int main()
{
fin >> n;
for(int i=1; i<=n; i++) {
int x, color; fin >> x >> color;
if(color == 0) v[i] = -x;
else v[i] = x;
}
Iris sumMax(-2e9), sumMin(2e9);
Iris sumCurentMax(0), sumCurentMin(0);
int sumTotal = 0;
for(int i=1; i<=n; i++) {
if(sumCurentMax.sum + v[i] > v[i]) sumCurentMax.sum += v[i], sumCurentMax.lung++;
else sumCurentMax.sum = v[i], sumCurentMax.poz = i, sumCurentMax.lung = 1;
if(sumCurentMax.sum > sumMax.sum) sumMax = sumCurentMax;
else if(sumCurentMax.sum == sumMax.sum) {
if(sumCurentMax.poz < sumMax.poz) sumMax = sumCurentMax;
else if(sumCurentMax.poz == sumMax.poz && sumCurentMax.lung < sumMax.lung) sumMax = sumCurentMax;
}
if(sumCurentMin.sum + v[i] < v[i]) sumCurentMin.sum += v[i], sumCurentMin.lung++;
else sumCurentMin.sum = v[i], sumCurentMin.poz = i, sumCurentMin.lung = 1;
if(sumCurentMin.sum < sumMin.sum) sumMin = sumCurentMin;
else if(sumCurentMin.sum == sumMin.sum) {
if(sumCurentMin.poz + sumCurentMin.lung - 1 < sumMin.poz) sumMin = sumCurentMin;
else if(sumCurentMin.poz + sumCurentMin.lung - 1 == sumMin.poz && sumCurentMin.lung > sumMin.lung) sumMin = sumCurentMin;
}
sumTotal += v[i];
}
if(sumTotal == sumMin.sum) fout << sumMax.sum << " " << sumMax.poz << " " << sumMax.lung;
else {
if(sumMax.sum > sumTotal - sumMin.sum) fout << sumMax.sum << " " << sumMax.poz << " " << sumMax.lung;
else fout << sumTotal - sumMin.sum << " " << mod(sumMin.poz + sumMin.lung) << " " << n - sumMin.lung;
}
return 0;
}