#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int maxn = 2e5 + 5;
const int inf = 1e18;
const int MOD = 1e9 + 9;
const int LIM = -1e9;
const int LIM1 = -1e9 - 5;
const int LIM2 = 1e9 + 5;
int add(int a, int b){
a += b;
if (a >= MOD) a -= MOD;
if (a < 0) a += MOD;
return a;
}
int a[maxn], pre[maxn], dp[maxn], n;
namespace sub1{
void solve(){
dp[0] = 1;
for (int i = 1; i <= n; i++){
for (int j = 1; j <= i; j++) if (pre[i] - pre[j-1] >= 0){
dp[i] = add(dp[i], dp[j-1]);
}
}
cout << dp[n];
}
}
namespace sub2{
struct sparse_segtree{
struct node{
int sum;
node *l, *r;
node(){
sum = 0;
l = NULL;
r = NULL;
}
};
node *root;
sparse_segtree(){
root = new node();
}
void update(node* &id, int l, int r, int pos, int val){
if (!id) id = new node();
if (l > pos or r < pos) return;
if (l == r){
id->sum = add(id->sum, val);
return;
}
int mid = (l + r) >> 1;
update(id->l, l, mid, pos, val);
update(id->r, mid + 1, r, pos, val);
int val1 = 0, val2 = 0;
if (id->l) val1 = id->l->sum;
if (id->r) val2 = id->r->sum;
id->sum = add(val1, val2);
}
int get(node* id, int l, int r, int u, int v){
if (!id or l > v or r < u) return 0;
if (l >= u && r <= v) return id->sum;
int mid = (l + r) >> 1;
int get1 = get(id->l, l, mid, u, v);
int get2 = get(id->r, mid + 1, r, u, v);
return add(get1, get2);
}
void update(int pos, int val){
update(root, LIM1, LIM2, pos, val);
}
int get(int l, int r){
return get(root, LIM1, LIM2, l, r);
}
};
void solve(){
sparse_segtree smt;
smt.update(0, 1);
for (int i = 1; i <= n; i++){
dp[i] = add(dp[i], smt.get(LIM, pre[i]));
smt.update(pre[i], dp[i]);
}
cout << dp[n];
}
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
freopen("PROTEST.INP", "r", stdin); freopen("PROTEST.OUT", "w", stdout);
cin >> n;
for (int i = 1; i <= n; i++){
cin >> a[i];
pre[i] = pre[i-1] + a[i];
}
if (n <= 1e4) sub1::solve(); else sub2::solve();
return 0;
}
/*
4
2 3 -3 1
20
81 90 30 -49 -23 35 54 31 66 -42 38 64 58 42 67 -31 10 -13 83 34
*/
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIGVuZGwgJ1xuJwoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBtYXhuID0gMmU1ICsgNTsKY29uc3QgaW50IGluZiA9IDFlMTg7CmNvbnN0IGludCBNT0QgPSAxZTkgKyA5Owpjb25zdCBpbnQgTElNID0gLTFlOTsKY29uc3QgaW50IExJTTEgPSAtMWU5IC0gNTsKY29uc3QgaW50IExJTTIgPSAxZTkgKyA1OwoKaW50IGFkZChpbnQgYSwgaW50IGIpewogICAgYSArPSBiOwogICAgaWYgKGEgPj0gTU9EKSBhIC09IE1PRDsKICAgIGlmIChhIDwgMCkgYSArPSBNT0Q7CiAgICByZXR1cm4gYTsKfQoKaW50IGFbbWF4bl0sIHByZVttYXhuXSwgZHBbbWF4bl0sIG47CgpuYW1lc3BhY2Ugc3ViMXsKCiAgICB2b2lkIHNvbHZlKCl7CiAgICAgICAgZHBbMF0gPSAxOwogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKyl7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAxOyBqIDw9IGk7IGorKykgaWYgKHByZVtpXSAtIHByZVtqLTFdID49IDApewogICAgICAgICAgICAgICAgZHBbaV0gPSBhZGQoZHBbaV0sIGRwW2otMV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgCiAgICAgICAgY291dCA8PCBkcFtuXTsKICAgIH0KCn0KCm5hbWVzcGFjZSBzdWIyewoKICAgIHN0cnVjdCBzcGFyc2Vfc2VndHJlZXsKICAgICAgICBzdHJ1Y3Qgbm9kZXsKICAgICAgICAgICAgaW50IHN1bTsKICAgICAgICAgICAgbm9kZSAqbCwgKnI7CiAgICAgICAgICAgIG5vZGUoKXsKICAgICAgICAgICAgICAgIHN1bSA9IDA7CiAgICAgICAgICAgICAgICBsID0gTlVMTDsKICAgICAgICAgICAgICAgIHIgPSBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIAogICAgICAgIG5vZGUgKnJvb3Q7CiAgICAgICAgc3BhcnNlX3NlZ3RyZWUoKXsKICAgICAgICAgICAgcm9vdCA9IG5ldyBub2RlKCk7CiAgICAgICAgfQogICAgCiAgICAgICAgdm9pZCB1cGRhdGUobm9kZSogJmlkLCBpbnQgbCwgaW50IHIsIGludCBwb3MsIGludCB2YWwpewogICAgICAgICAgICBpZiAoIWlkKSBpZCA9IG5ldyBub2RlKCk7CiAgICAgICAgICAgIGlmIChsID4gcG9zIG9yIHIgPCBwb3MpIHJldHVybjsKICAgICAgICAgICAgaWYgKGwgPT0gcil7CiAgICAgICAgICAgICAgICBpZC0+c3VtID0gYWRkKGlkLT5zdW0sIHZhbCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsKICAgICAgICAgICAgdXBkYXRlKGlkLT5sLCBsLCBtaWQsIHBvcywgdmFsKTsKICAgICAgICAgICAgdXBkYXRlKGlkLT5yLCBtaWQgKyAxLCByLCBwb3MsIHZhbCk7CiAgICAgICAgICAgIGludCB2YWwxID0gMCwgdmFsMiA9IDA7CiAgICAgICAgICAgIGlmIChpZC0+bCkgdmFsMSA9IGlkLT5sLT5zdW07CiAgICAgICAgICAgIGlmIChpZC0+cikgdmFsMiA9IGlkLT5yLT5zdW07CiAgICAgICAgICAgIGlkLT5zdW0gPSBhZGQodmFsMSwgdmFsMik7CiAgICAgICAgfQogICAgCiAgICAgICAgaW50IGdldChub2RlKiBpZCwgaW50IGwsIGludCByLCBpbnQgdSwgaW50IHYpewogICAgICAgICAgICBpZiAoIWlkIG9yIGwgPiB2IG9yIHIgPCB1KSByZXR1cm4gMDsKICAgICAgICAgICAgaWYgKGwgPj0gdSAmJiByIDw9IHYpIHJldHVybiBpZC0+c3VtOwogICAgICAgICAgICBpbnQgbWlkID0gKGwgKyByKSA+PiAxOwogICAgICAgICAgICBpbnQgZ2V0MSA9IGdldChpZC0+bCwgbCwgbWlkLCB1LCB2KTsKICAgICAgICAgICAgaW50IGdldDIgPSBnZXQoaWQtPnIsIG1pZCArIDEsIHIsIHUsIHYpOwogICAgICAgICAgICByZXR1cm4gYWRkKGdldDEsIGdldDIpOwogICAgICAgIH0KICAgIAogICAgICAgIHZvaWQgdXBkYXRlKGludCBwb3MsIGludCB2YWwpewogICAgICAgICAgICB1cGRhdGUocm9vdCwgTElNMSwgTElNMiwgcG9zLCB2YWwpOwogICAgICAgIH0KICAgIAogICAgICAgIGludCBnZXQoaW50IGwsIGludCByKXsKICAgICAgICAgICAgcmV0dXJuIGdldChyb290LCBMSU0xLCBMSU0yLCBsLCByKTsKICAgICAgICB9CiAgICAKICAgIH07CiAgICAKICAgIAogICAgdm9pZCBzb2x2ZSgpewogICAgICAgIHNwYXJzZV9zZWd0cmVlIHNtdDsKICAgICAgICBzbXQudXBkYXRlKDAsIDEpOwogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKyl7CiAgICAgICAgICAgIGRwW2ldID0gYWRkKGRwW2ldLCBzbXQuZ2V0KExJTSwgcHJlW2ldKSk7CiAgICAgICAgICAgIHNtdC51cGRhdGUocHJlW2ldLCBkcFtpXSk7CiAgICAgICAgfQogICAgICAgIGNvdXQgPDwgZHBbbl07CiAgICB9Cgp9CgpzaWduZWQgbWFpbigpewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKICAgIGZyZW9wZW4oIlBST1RFU1QuSU5QIiwgInIiLCBzdGRpbik7IGZyZW9wZW4oIlBST1RFU1QuT1VUIiwgInciLCBzdGRvdXQpOwoKICAgIGNpbiA+PiBuOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKXsKICAgICAgICBjaW4gPj4gYVtpXTsKICAgICAgICBwcmVbaV0gPSBwcmVbaS0xXSArIGFbaV07CiAgICB9CgogICAgaWYgKG4gPD0gMWU0KSBzdWIxOjpzb2x2ZSgpOyBlbHNlIHN1YjI6OnNvbHZlKCk7CiAgICAKICAgIHJldHVybiAwOwp9Ci8qCjQKMiAzIC0zIDEKCjIwCjgxIDkwIDMwIC00OSAtMjMgMzUgNTQgMzEgNjYgLTQyIDM4IDY0IDU4IDQyIDY3IC0zMSAxMCAtMTMgODMgMzQKKi8K