diff --git a/Segment_Tree/2179.Count-Good-Triplets-in-an-Array/2179.Count-Good-Triplets-in-an-Array.cpp b/Segment_Tree/2179.Count-Good-Triplets-in-an-Array/2179.Count-Good-Triplets-in-an-Array.cpp new file mode 100644 index 000000000..ff8182c6a --- /dev/null +++ b/Segment_Tree/2179.Count-Good-Triplets-in-an-Array/2179.Count-Good-Triplets-in-an-Array.cpp @@ -0,0 +1,76 @@ +class BIT{ + public: + int N; + vectorbitArr; // Note: all arrays are 1-index + vectornums; + long long M = 1e9+7; + + BIT(int N) + { + this->N = N; + bitArr.resize(N+1); + nums.resize(N+1); + } + + // increase nums[i] by delta + void updateDelta(int i, long long delta) { + int idx = i; + while (idx <= N) + { + bitArr[idx]+=delta; + bitArr[idx] %= M; + idx+=idx&(-idx); + } + } + + // sum of a range nums[1:j] inclusively + long long queryPreSum(int idx){ + long long result = 0; + while (idx){ + result += bitArr[idx]; + result %= M; + idx-=idx&(-idx); + } + return result; + } + + // sum of a range nums[i:j] inclusively + long long sumRange(int i, int j) { + return queryPreSum(j)-queryPreSum(i-1); + } +}; + +class Solution { +public: + long long goodTriplets(vector& nums1, vector& nums2) + { + int n = nums1.size(); + unordered_mapMap; + for (int i=0; ismallerBefore(n,0); + BIT bit1(100005); + for (int i=0; ilargerAfter(n,0); + BIT bit2(100005); + for (int i=n-1; i>=0; i--) + { + largerAfter[i] = bit2.sumRange(nums2[i], 100000); + bit2.updateDelta(nums2[i], 1); + } + + long long ret = 0; + for (int i=0; i