#include <iostream>
#include <iomanip>
#include <vector>
#include <valarray>
#include <map>
#include <set>
#include <list>
#include <queue>
#include <stack>
#include <bitset>
#include <utility>
#include <numeric>
#include <algorithm>
#include <functional>
#include <complex>
#include <string>
#include <sstream>

#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <cassert>

#include <unordered_set>
#include <unordered_map>
#include <random>
#include <thread>
#include <chrono>

using namespace std;

#define all(c) c.begin(), c.end()
#define repeat(i, n) for (int i = 0; i < static_cast<int>(n); i++)
#define debug(x) #x << "=" << (x)

#ifdef DEBUG
#define dump(x) std::cerr << debug(x) << " (L:" << __LINE__ << ")" << std::endl
#else
#define dump(x) 
#endif

typedef complex<double> point;

template <typename T>
ostream &operator<<(ostream &os, const vector<T> &v)
{
    os << "{";
    for(auto it = v.begin(); it != v.end(); ++it) {
        if(it != v.begin())
            os << ",";
        os << *it;
    }
    return os << "}";
}

using ll = int64_t;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    int n;
    cin >> n;
    vector<ll> a(n);
    for (int i = 0; i < n; i++){
        cin >> a[i];
    }
    vector<pair<int, int>> ds;
    int left = 0;
    int right = 0;
    int adcur = 0;
    int xocur = 0;
    while (right < n) {
        adcur += a[right];
        xocur ^= a[right];
        while(adcur != xocur) {
            adcur -= a[left];
            xocur ^= a[left];
            left++;
        }
        while(right+1 < n) {
            int nadcur = adcur + a[right+1];
            int nxocur = xocur ^ a[right+1];
            if(nadcur == nxocur){
                right++;
                adcur = nadcur;
                xocur = nxocur;
            } else {
                break;
            }
        }
        ds.push_back({ left, right });
        right++;
    }
    ll ret = 0;
    int pright = -1;
    for (auto p : ds) {
        // std::cerr << p.first << " " << p.second << std::endl;

        int left = p.first;
        int right = p.second;
        ll sz = (right - left + 1);
        ret += ((sz + 1) * sz) / 2;

        if (left <= pright) {
            ll psz = (pright - left + 1);
            ret -= ((psz + 1) * psz) / 2;
        }
        pright = right;
    }
    cout << ret << endl;
    // {
    // vector<pair<int, int>> ds;
    // int k = 0;
    // int ppk = -1;
    // while (k < n) {
    //     int pk = k;
    //     ll ad = 0;
    //     ll xo = 0;
    //     for (int i = k; i < n; i++){
    //         ad += a[i];
    //         xo ^= a[i];
    //         if (ad == xo) {
    //             k++;
    //         } else {
    //             break;
    //         }
    //     }
    //     ds.push_back({ pk, k });
    // }
    // ll ret = 0;
    // for (auto p : ds) {
    //     ll sz = p.second - p.first;
    //     // ret += (sz * (sz - 1)) / 2;
    //     ret += ((sz + 1) * sz) / 2;
    //     std::cerr << p.first << " " << p.second << std::endl;
    // }
    // cout << ret << endl;
    // }
    // {
    //     ll ret = 0;
    //     for (int i = 0; i < n; i++) {
    //         ll ad = 0;
    //         ll xo = 0;
    //         for (int j = i; j < n; j++) {
    //             ad += a[j];
    //             xo ^= a[j];
    //             if (ad == xo) {
    //                 ret++;
    //             } else{
    //                 break;
    //             }
    //         }
    //     }
    //     cout << ret << endl;
    // }
    return 0;
}


Measured memory_bytes: 3956