// Source : https://leetcode.com/problems/number-of-sub-arrays-with-odd-sum/
// Author : Hao Chen
// Date   : 2020-10-07

/***************************************************************************************************** 
 *
 * Given an array of integers arr. Return the number of sub-arrays with odd sum.
 * 
 * As the answer may grow large, the answer must be computed modulo 10^9 + 7.
 * 
 * Example 1:
 * 
 * Input: arr = [1,3,5]
 * Output: 4
 * Explanation: All sub-arrays are [[1],[1,3],[1,3,5],[3],[3,5],[5]]
 * All sub-arrays sum are [1,4,9,3,8,5].
 * Odd sums are [1,9,3,5] so the answer is 4.
 * 
 * Example 2:
 * 
 * Input: arr = [2,4,6]
 * Output: 0
 * Explanation: All sub-arrays are [[2],[2,4],[2,4,6],[4],[4,6],[6]]
 * All sub-arrays sum are [2,6,12,4,10,6].
 * All sub-arrays have even sum and the answer is 0.
 * 
 * Example 3:
 * 
 * Input: arr = [1,2,3,4,5,6,7]
 * Output: 16
 * 
 * Example 4:
 * 
 * Input: arr = [100,100,99,99]
 * Output: 4
 * 
 * Example 5:
 * 
 * Input: arr = [7]
 * Output: 1
 * 
 * Constraints:
 * 
 * 	1 <= arr.length <= 10^5
 * 	1 <= arr[i] <= 100
 ******************************************************************************************************/

class Solution {
public:
    int numOfSubarrays(vector<int>& arr) {
        //Walk through the array, and calculate the current sum
        //if current sum is odd, then all of the sum are evil previously are valid sub-array
        //if current sum is evil, then all of the sum are odd previously are valid sub-array
        int odd_sum_cnt=0, evil_sum_cnt=0;
        int sum = 0;
        long long result=0;
        for (auto a : arr) {
            sum += a;
            if (sum % 2 == 0) {
                evil_sum_cnt++;
                result += odd_sum_cnt;
            }else {
                odd_sum_cnt++;
                result += evil_sum_cnt + 1;
            }
        }

        return result % 1000000007;

    }
};