Cod sursa(job #3304798)

Utilizator Cyb3rBoltSbora Ioan-David Cyb3rBolt Data 27 iulie 2025 13:44:53
Problema Buline Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#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;
}