Use this to learn the idea, then write your own version.
1struct Node {2 int remain[5] = {0};3 int prod = 1;4};5 6class SegmentTree {7 public:8 explicit SegmentTree(const vector<int>& nums, int k)9 : n(nums.size()), k(k), tree(4 * n) {10 build(nums, 0, 0, n - 1);11 }12 13 14 void update(int i, int val) {15 update(0, 0, n - 1, i, val);16 }17 18 19 Node query(int i, int j) const {20 return query(0, 0, n - 1, i, j);21 }22 23 private:24 const int n; 25 const int k; 26 vector<Node> tree; 27 28 void build(const vector<int>& nums, int cur, int left, int right) {29 if (left == right) {30 tree[cur].remain[nums[left]] = 1;31 tree[cur].prod = nums[left];32 return;33 }34 const int mid = (left + right) / 2;35 build(nums, 2 * cur + 1, left, mid);36 build(nums, 2 * cur + 2, mid + 1, right);37 tree[cur] = merge(tree[2 * cur + 1], tree[2 * cur + 2]);38 }39 40 void update(int treeIndex, int lo, int hi, int i, int val) {41 if (lo == hi) {42 for (int j = 0; j < k; ++j)43 tree[treeIndex].remain[j] = 0;44 tree[treeIndex].remain[val] = 1;45 tree[treeIndex].prod = val;46 return;47 }48 const int mid = (lo + hi) / 2;49 if (i <= mid)50 update(2 * treeIndex + 1, lo, mid, i, val);51 else52 update(2 * treeIndex + 2, mid + 1, hi, i, val);53 tree[treeIndex] = merge(tree[2 * treeIndex + 1], tree[2 * treeIndex + 2]);54 }55 56 Node query(int treeIndex, int lo, int hi, int i, int j) const {57 if (i <= lo && hi <= j) 58 return tree[treeIndex];59 if (j < lo || hi < i) 60 return Node();61 const int mid = (lo + hi) / 2;62 return merge(query(2 * treeIndex + 1, lo, mid, i, j),63 query(2 * treeIndex + 2, mid + 1, hi, i, j));64 }65 66 Node merge(const Node& left, const Node& right) const {67 Node node;68 node.prod = (left.prod * right.prod) % k;69 for (int i = 0; i < k; ++i)70 node.remain[i] = left.remain[i];71 for (int i = 0; i < k; ++i)72 node.remain[(i * left.prod) % k] += right.remain[i];73 return node;74 }75};76 77class Solution {78 public:79 vector<int> resultArray(vector<int>& nums, int k,80 vector<vector<int>>& queries) {81 for (int& num : nums)82 num %= k;83 84 for (vector<int>& query : queries)85 query[1] %= k;86 87 const int n = nums.size();88 vector<int> ans;89 SegmentTree tree(nums, k);90 91 for (const vector<int>& query : queries) {92 const int index = query[0];93 const int value = query[1];94 const int start = query[2];95 const int x = query[3];96 tree.update(index, value);97 ans.push_back(tree.query(start, n - 1).remain[x]);98 }99 100 return ans;101 }102};103