#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define PhTrNghia "PROTEST"
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);
if (fopen(PhTrNghia".INP", "r")){
freopen(PhTrNghia".INP", "r", stdin);
freopen(PhTrNghia".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+CiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIGVuZGwgJ1xuJwojZGVmaW5lIFBoVHJOZ2hpYSAiUFJPVEVTVCIKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgbWF4biA9IDJlNSArIDU7CmNvbnN0IGludCBpbmYgPSAxZTE4Owpjb25zdCBpbnQgTU9EID0gMWU5ICsgOTsKY29uc3QgaW50IExJTSA9IC0xZTk7CmNvbnN0IGludCBMSU0xID0gLTFlOSAtIDU7CmNvbnN0IGludCBMSU0yID0gMWU5ICsgNTsKCmludCBhZGQoaW50IGEsIGludCBiKXsKICAgIGEgKz0gYjsKICAgIGlmIChhID49IE1PRCkgYSAtPSBNT0Q7CiAgICBpZiAoYSA8IDApIGEgKz0gTU9EOwogICAgcmV0dXJuIGE7Cn0KCmludCBhW21heG5dLCBwcmVbbWF4bl0sIGRwW21heG5dLCBuOwoKbmFtZXNwYWNlIHN1YjF7CgogICAgdm9pZCBzb2x2ZSgpewogICAgICAgIGRwWzBdID0gMTsKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspewogICAgICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8PSBpOyBqKyspIGlmIChwcmVbaV0gLSBwcmVbai0xXSA+PSAwKXsKICAgICAgICAgICAgICAgIGRwW2ldID0gYWRkKGRwW2ldLCBkcFtqLTFdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIAogICAgICAgIGNvdXQgPDwgZHBbbl07CiAgICB9Cgp9CgpuYW1lc3BhY2Ugc3ViMnsKCiAgICBzdHJ1Y3Qgc3BhcnNlX3NlZ3RyZWV7CiAgICAgICAgc3RydWN0IG5vZGV7CiAgICAgICAgICAgIGludCBzdW07CiAgICAgICAgICAgIG5vZGUgKmwsICpyOwogICAgICAgICAgICBub2RlKCl7CiAgICAgICAgICAgICAgICBzdW0gPSAwOwogICAgICAgICAgICAgICAgbCA9IE5VTEw7CiAgICAgICAgICAgICAgICByID0gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAKICAgICAgICBub2RlICpyb290OwogICAgICAgIHNwYXJzZV9zZWd0cmVlKCl7CiAgICAgICAgICAgIHJvb3QgPSBuZXcgbm9kZSgpOwogICAgICAgIH0KICAgIAogICAgICAgIHZvaWQgdXBkYXRlKG5vZGUqICZpZCwgaW50IGwsIGludCByLCBpbnQgcG9zLCBpbnQgdmFsKXsKICAgICAgICAgICAgaWYgKCFpZCkgaWQgPSBuZXcgbm9kZSgpOwogICAgICAgICAgICBpZiAobCA+IHBvcyBvciByIDwgcG9zKSByZXR1cm47CiAgICAgICAgICAgIGlmIChsID09IHIpewogICAgICAgICAgICAgICAgaWQtPnN1bSA9IGFkZChpZC0+c3VtLCB2YWwpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGludCBtaWQgPSAobCArIHIpID4+IDE7CiAgICAgICAgICAgIHVwZGF0ZShpZC0+bCwgbCwgbWlkLCBwb3MsIHZhbCk7CiAgICAgICAgICAgIHVwZGF0ZShpZC0+ciwgbWlkICsgMSwgciwgcG9zLCB2YWwpOwogICAgICAgICAgICBpbnQgdmFsMSA9IDAsIHZhbDIgPSAwOwogICAgICAgICAgICBpZiAoaWQtPmwpIHZhbDEgPSBpZC0+bC0+c3VtOwogICAgICAgICAgICBpZiAoaWQtPnIpIHZhbDIgPSBpZC0+ci0+c3VtOwogICAgICAgICAgICBpZC0+c3VtID0gYWRkKHZhbDEsIHZhbDIpOwogICAgICAgIH0KICAgIAogICAgICAgIGludCBnZXQobm9kZSogaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2KXsKICAgICAgICAgICAgaWYgKCFpZCBvciBsID4gdiBvciByIDwgdSkgcmV0dXJuIDA7CiAgICAgICAgICAgIGlmIChsID49IHUgJiYgciA8PSB2KSByZXR1cm4gaWQtPnN1bTsKICAgICAgICAgICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsKICAgICAgICAgICAgaW50IGdldDEgPSBnZXQoaWQtPmwsIGwsIG1pZCwgdSwgdik7CiAgICAgICAgICAgIGludCBnZXQyID0gZ2V0KGlkLT5yLCBtaWQgKyAxLCByLCB1LCB2KTsKICAgICAgICAgICAgcmV0dXJuIGFkZChnZXQxLCBnZXQyKTsKICAgICAgICB9CiAgICAKICAgICAgICB2b2lkIHVwZGF0ZShpbnQgcG9zLCBpbnQgdmFsKXsKICAgICAgICAgICAgdXBkYXRlKHJvb3QsIExJTTEsIExJTTIsIHBvcywgdmFsKTsKICAgICAgICB9CiAgICAKICAgICAgICBpbnQgZ2V0KGludCBsLCBpbnQgcil7CiAgICAgICAgICAgIHJldHVybiBnZXQocm9vdCwgTElNMSwgTElNMiwgbCwgcik7CiAgICAgICAgfQogICAgCiAgICB9OwogICAgCiAgICAKICAgIHZvaWQgc29sdmUoKXsKICAgICAgICBzcGFyc2Vfc2VndHJlZSBzbXQ7CiAgICAgICAgc210LnVwZGF0ZSgwLCAxKTsKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspewogICAgICAgICAgICBkcFtpXSA9IGFkZChkcFtpXSwgc210LmdldChMSU0sIHByZVtpXSkpOwogICAgICAgICAgICBzbXQudXBkYXRlKHByZVtpXSwgZHBbaV0pOwogICAgICAgIH0KICAgICAgICBjb3V0IDw8IGRwW25dOwogICAgfQoKfQoKc2lnbmVkIG1haW4oKXsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CiAgICBpZiAoZm9wZW4oUGhUck5naGlhIi5JTlAiLCAiciIpKXsKICAgICAgICBmcmVvcGVuKFBoVHJOZ2hpYSIuSU5QIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbihQaFRyTmdoaWEiLk9VVCIsICJ3Iiwgc3Rkb3V0KTsKICAgIH0KIAogICAgY2luID4+IG47CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspewogICAgICAgIGNpbiA+PiBhW2ldOwogICAgICAgIHByZVtpXSA9IHByZVtpLTFdICsgYVtpXTsKICAgIH0KCiAgICBpZiAobiA8PSAxZTQpIHN1YjE6OnNvbHZlKCk7IGVsc2Ugc3ViMjo6c29sdmUoKTsKICAgIAogICAgcmV0dXJuIDA7Cn0KLyoKNAoyIDMgLTMgMQoKMjAKODEgOTAgMzAgLTQ5IC0yMyAzNSA1NCAzMSA2NiAtNDIgMzggNjQgNTggNDIgNjcgLTMxIDEwIC0xMyA4MyAzNAoqLwo=