typedeflonglong ll; #define PI pair<ll, int> constint N = 200005; const ll P = 4398042316712111199; int n, a[N], lg[N]; ll sum[N], h[N], ans; PI mx[N][20];
namespace H { constint M = 19260817; int hd[M] = {}, tot = 0; structE{int nxt, o; ll v;}e[N]; voidinsert(ll h, int o){int t = ((h % M + M) % M + M) % M, mx = max(t, mx); e[++tot] = E{hd[t], o, h}; hd[t] = tot;} intquery(ll h){for(int i = hd[((h % M + M) % M + M) % M]; i; i = e[i].nxt) if(e[i].v == h) return e[i].o; return-1;} }
ll mul(ll a, ll b){ ll c = a * b - (ll)((longdouble)a * b / P + 0.5) * P; return c < 0 ? c + P : c; } ll fpow(ll a, ll b){ ll ans = 1; for(; b; b >>= 1, a = mul(a, a)) if(b & 1) ans = mul(ans, a); return ans; } voidsolve(int l, int r){ if(l == r) { ans += 1; } if(l >= r) return; int len = lg[r - l + 1], m = max(mx[l][len], mx[r - (1 << len) + 1][len]).second; if(r + l >= m + m) { for(int i = l; i <= m; i++) { ll t = h[m]; for(int j = 1; j <= 20; j++) { ll q = t + sum[i - 1]; if(q >= P) q -= P; int p = H::query(q); if(p >= m && p <= r) ans++; t *= 2; if(t >= P) t -= P; } } } else { for(int i = m; i <= r; i++) { ll t = h[m]; for(int j = 1; j <= 20; j++) { ll q = sum[i] - t; if(q < 0) q += P; int p = H::query(q) + 1; if(p <= m && p >= l) ans++; t *= 2; if(t >= P) t -= P; } } } solve(l, m - 1); solve(m + 1, r); }