#include <bits/stdc++.h>
using namespace std;
void *wmem;
void sortF_L(int N, unsigned A[], void *mem = wmem) {
  int bt, i, m, *sz;
  unsigned *arr, c;
  if (N < 256) {
    sort(A, A + N);
    return;
  }
  bt = sizeof(unsigned) * 8;
  arr = (unsigned *)mem;
  sz = (int *)(arr + N);
  for (m = 0; m < bt; m += 8) {
    for (i = 0; i < 257; i++) {
      sz[i] = 0;
    }
    for (i = 0; i < N; i++) {
      sz[1 + ((A[i] >> m) & 255u)]++;
    }
    for (i = 1; i < 257; i++) {
      sz[i] += sz[i - 1];
    }
    for (i = 0; i < N; i++) {
      c = ((A[i] >> m) & 255u);
      arr[sz[c]++] = A[i];
    }
    swap(A, arr);
  }
}
void sortF_L(int N, int A[], void *mem = wmem) {
  int *arr, i, x, y, z;
  unsigned *send;
  if (N < 256) {
    sort(A, A + N);
    return;
  }
  send = (unsigned *)A;
  sortF_L(N, send, mem);
  if (A[0] < 0 || A[N - 1] >= 0) {
    return;
  }
  x = 0;
  y = N;
  while (x < y) {
    z = (x + y) / 2;
    if (A[z] < 0) {
      y = z;
    } else {
      x = z + 1;
    }
  }
  arr = (int *)mem;
  z = 0;
  for (i = x; i < N; i++) {
    arr[z++] = A[i];
  }
  for (i = 0; i < x; i++) {
    arr[z++] = A[i];
  }
  for (i = 0; i < N; i++) {
    A[i] = arr[i];
  }
}
void sortF_L(int N, unsigned long long A[], void *mem = wmem) {
  int bt, i, m, *sz;
  unsigned c;
  unsigned long long *arr;
  if (N < 512) {
    sort(A, A + N);
    return;
  }
  bt = sizeof(unsigned long long) * 8;
  arr = (unsigned long long *)mem;
  sz = (int *)(arr + N);
  for (m = 0; m < bt; m += 8) {
    for (i = 0; i < 257; i++) {
      sz[i] = 0;
    }
    for (i = 0; i < N; i++) {
      sz[1 + ((A[i] >> m) & 255u)]++;
    }
    for (i = 1; i < 257; i++) {
      sz[i] += sz[i - 1];
    }
    for (i = 0; i < N; i++) {
      c = ((A[i] >> m) & 255u);
      arr[sz[c]++] = A[i];
    }
    swap(A, arr);
  }
}
void sortF_L(int N, long long A[], void *mem = wmem) {
  int i, x, y, z;
  long long *arr;
  unsigned long long *send;
  if (N < 512) {
    sort(A, A + N);
    return;
  }
  send = (unsigned long long *)A;
  sortF_L(N, send, mem);
  if (A[0] < 0 || A[N - 1] >= 0) {
    return;
  }
  x = 0;
  y = N;
  while (x < y) {
    z = (x + y) / 2;
    if (A[z] < 0) {
      y = z;
    } else {
      x = z + 1;
    }
  }
  arr = (long long *)mem;
  z = 0;
  for (i = x; i < N; i++) {
    arr[z++] = A[i];
  }
  for (i = 0; i < x; i++) {
    arr[z++] = A[i];
  }
  for (i = 0; i < N; i++) {
    A[i] = arr[i];
  }
}
void rd(int &x) {
  int k, m = 0;
  x = 0;
  for (;;) {
    k = getchar_unlocked();
    if (k == '-') {
      m = 1;
      break;
    }
    if ('0' <= k && k <= '9') {
      x = k - '0';
      break;
    }
  }
  for (;;) {
    k = getchar_unlocked();
    if (k < '0' || k > '9') {
      break;
    }
    x = x * 10 + k - '0';
  }
  if (m) {
    x = -x;
  }
}
void wt_L(long long x) {
  char f[20];
  int m = 0, s = 0;
  if (x < 0) {
    m = 1;
    x = -x;
  }
  while (x) {
    f[s++] = x % 10;
    x /= 10;
  }
  if (!s) {
    f[s++] = 0;
  }
  if (m) {
    putchar_unlocked('-');
  }
  while (s--) {
    putchar_unlocked(f[s] + '0');
  }
}
char memarr[96000000];
int A[100000], N;
long long arr[100001];
unsigned long long *arr_for_sort;
int main() {
  int i, j;
  long long res = 0;
  wmem = memarr;
  rd(N);
  {
    int Lj4PdHRW;
    for (Lj4PdHRW = 0; Lj4PdHRW < N; Lj4PdHRW++) {
      rd(A[Lj4PdHRW]);
    }
  }
  {
    int KL2GvlyY;
    for (KL2GvlyY = 1; KL2GvlyY < (N) + 1; KL2GvlyY++) {
      arr[KL2GvlyY] = arr[KL2GvlyY - (1) + (0)] + A[KL2GvlyY - (1) + (0)];
    }
  }
  arr_for_sort = (unsigned long long *)arr;
  sortF_L(N + 1, arr_for_sort);
  j = 0;
  for (i = 0; i < N; i++) {
    if (arr[i + 1] == arr[i]) {
      res += ++j;
    } else {
      j = 0;
    }
  }
  wt_L(res);
  putchar_unlocked('\n');
  return 0;
}
