Use this to learn the idea, then write your own version.
1struct SegmentTreeNode {2 int lo;3 int hi;4 char maxLetter;5 char prefixLetter;6 char suffixLetter;7 int maxLength;8 int prefixLength;9 int suffixLength;10 SegmentTreeNode* left;11 SegmentTreeNode* right;12 SegmentTreeNode(int lo, int hi, char maxLetter, char prefixLetter,13 char suffixLetter, int maxLength, int prefixLength,14 int suffixLength, SegmentTreeNode* left = nullptr,15 SegmentTreeNode* right = nullptr)16 : lo(lo),17 hi(hi),18 maxLetter(maxLetter),19 prefixLetter(prefixLetter),20 suffixLetter(suffixLetter),21 maxLength(maxLength),22 prefixLength(prefixLength),23 suffixLength(suffixLength),24 left(left),25 right(right) {}26 ~SegmentTreeNode() {27 delete left;28 delete right;29 left = nullptr;30 right = nullptr;31 }32};33 34class SegmentTree {35 public:36 explicit SegmentTree(const string& s) : root(build(s, 0, s.length() - 1)) {}37 ~SegmentTree() {38 delete root;39 }40 41 void update(int i, char val) {42 root = update(root, i, val);43 }44 45 int getMaxLength() {46 return root->maxLength;47 }48 49 private:50 SegmentTreeNode* root;51 52 SegmentTreeNode* build(const string& s, int lo, int hi) const {53 if (lo == hi)54 return new SegmentTreeNode(lo, hi, s[lo], s[lo], s[lo], 1, 1, 1);55 const int mid = (lo + hi) / 2;56 SegmentTreeNode* left = build(s, lo, mid);57 SegmentTreeNode* right = build(s, mid + 1, hi);58 return merge(left, right);59 }60 61 SegmentTreeNode* update(SegmentTreeNode* root, int i, char c) {62 if (root->lo == i && root->hi == i) {63 root->maxLetter = c;64 root->prefixLetter = c;65 root->suffixLetter = c;66 return root;67 }68 const int mid = (root->lo + root->hi) / 2;69 if (i <= mid) {70 SegmentTreeNode* updatedLeft = update(root->left, i, c);71 return root = merge(updatedLeft, root->right);72 } else {73 SegmentTreeNode* updatedRight = update(root->right, i, c);74 return root = merge(root->left, updatedRight);75 }76 }77 78 SegmentTreeNode* merge(SegmentTreeNode* left, SegmentTreeNode* right) const {79 80 char maxLetter = ' ';81 int maxLength = 0;82 if (left->maxLength > right->maxLength) {83 maxLetter = left->maxLetter;84 maxLength = left->maxLength;85 } else {86 maxLetter = right->maxLetter;87 maxLength = right->maxLength;88 }89 if (left->suffixLetter == right->prefixLetter &&90 left->suffixLength + right->prefixLength > maxLength) {91 maxLetter = left->suffixLetter;92 maxLength = left->suffixLength + right->prefixLength;93 }94 95 96 char prefixLetter = left->prefixLetter;97 int prefixLength = left->prefixLength;98 if (left->lo + prefixLength == right->lo &&99 left->prefixLetter == right->prefixLetter)100 prefixLength += right->prefixLength;101 102 103 char suffixLetter = right->suffixLetter;104 int suffixLength = right->suffixLength;105 if (right->hi - suffixLength == left->hi &&106 right->suffixLetter == left->suffixLetter)107 suffixLength += left->suffixLength;108 return new SegmentTreeNode(left->lo, right->hi, maxLetter, prefixLetter,109 suffixLetter, maxLength, prefixLength,110 suffixLength, left, right);111 }112};113 114class Solution {115 public:116 vector<int> longestRepeating(string s, string queryLetteracters,117 vector<int>& queryIndices) {118 vector<int> ans;119 SegmentTree tree(s);120 121 for (int i = 0; i < queryIndices.size(); ++i) {122 tree.update(queryIndices[i], queryLetteracters[i]);123 ans.push_back(tree.getMaxLength());124 }125 126 return ans;127 }128};129