#include<cstdio>
#include<algorithm>
#define MAXN2 1000003
const long long INF = 100000000000000000LL;
int indeks_najwyzszy_minus;
int n, a;
// ---tablica
long long glob_suma = 0;
int indeks_zero;
long long tab[MAXN2];
long long wartosc(int indeks) {
return tab[indeks + indeks_zero] + glob_suma;
}
void dodaj_nowe_poprawne_zero() {
tab[indeks_zero - 1] = -glob_suma;
}
void dodaj_nowe_niepoprawne_zero() {
tab[indeks_zero - 1] = -INF;
}
// ---tablica
int main () {
scanf("%d", &n);
indeks_zero = n;
for (int i = 0; i < n; i++) {
scanf("%d", &a);
// 1. dodaj zerowy jesli mozna:
if (wartosc(0) >= 0LL) {
dodaj_nowe_poprawne_zero();
} else {
dodaj_nowe_niepoprawne_zero();
}
// 2.
if (wartosc(0) < 0LL && wartosc(i) >= 0LL) {
// ustaw najwyzszy minus na `a`
indeks_najwyzszy_minus = (std::lower_bound(tab+indeks_zero, tab+indeks_zero+i, -glob_suma) - tab) - 1;
tab[indeks_najwyzszy_minus] = -glob_suma;
}
// 3. aktualizuj glob_suma i indeks_zero:
indeks_zero--;
glob_suma += a;
}
bool jest = false;
for (int i = 0; i < n; i++) {
if (wartosc(i) >= 0LL) {
printf("%d\n", i);
jest = true;
break;
}
}
if (!jest) {
printf("-1\n");
}
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | #include<cstdio> #include<algorithm> #define MAXN2 1000003 const long long INF = 100000000000000000LL; int indeks_najwyzszy_minus; int n, a; // ---tablica long long glob_suma = 0; int indeks_zero; long long tab[MAXN2]; long long wartosc(int indeks) { return tab[indeks + indeks_zero] + glob_suma; } void dodaj_nowe_poprawne_zero() { tab[indeks_zero - 1] = -glob_suma; } void dodaj_nowe_niepoprawne_zero() { tab[indeks_zero - 1] = -INF; } // ---tablica int main () { scanf("%d", &n); indeks_zero = n; for (int i = 0; i < n; i++) { scanf("%d", &a); // 1. dodaj zerowy jesli mozna: if (wartosc(0) >= 0LL) { dodaj_nowe_poprawne_zero(); } else { dodaj_nowe_niepoprawne_zero(); } // 2. if (wartosc(0) < 0LL && wartosc(i) >= 0LL) { // ustaw najwyzszy minus na `a` indeks_najwyzszy_minus = (std::lower_bound(tab+indeks_zero, tab+indeks_zero+i, -glob_suma) - tab) - 1; tab[indeks_najwyzszy_minus] = -glob_suma; } // 3. aktualizuj glob_suma i indeks_zero: indeks_zero--; glob_suma += a; } bool jest = false; for (int i = 0; i < n; i++) { if (wartosc(i) >= 0LL) { printf("%d\n", i); jest = true; break; } } if (!jest) { printf("-1\n"); } return 0; } |
English