Advertisement
adityasuman100

segment tree snippet

Nov 11th, 2023 (edited)
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.30 KB | None | 0 0
  1. class obj
  2. {
  3. public:
  4.     unordered_map<int, int> mp;
  5.  
  6.     obj()
  7.     {
  8.     }
  9. };
  10.  
  11. class segmentTree
  12. {
  13. public:
  14.     vector<obj> segment;
  15.     segmentTree(int n)
  16.     {
  17.         // Creating a segment tree of size 4*N + 1.
  18.         segment = vector<obj>(4 * n + 1);
  19.     }
  20.  
  21.     void buildTree(vector<int> &arr, int l, int r, int index = 0)
  22.     {
  23.         if (l > r)
  24.         {
  25.             return;
  26.         }
  27.  
  28.         // It means it has only one element
  29.         if (l == r)
  30.         {
  31.             // segment[index].max_sum = arr[l];
  32.             // segment[index].max_prefix_sum = arr[l];
  33.             // segment[index].max_suffix_sum = arr[l];
  34.             // segment[index].sum = arr[l];
  35.             segment[index].mp[arr[l]]++;
  36.             return;
  37.         }
  38.  
  39.         int mid = (l + r) / 2;
  40.         int lChild = 2 * index + 1;
  41.         int rChild = 2 * index + 2;
  42.  
  43.         buildTree(arr, l, mid, lChild);
  44.         buildTree(arr, mid + 1, r, rChild);
  45.  
  46.         // Merging ans from leftChild and rightChild.
  47.         // segment[index].sum = segment[lChild].sum + segment[rChild].sum;
  48.         // segment[index].max_prefix_sum = max(segment[lChild].max_prefix_sum, segment[lChild].sum + segment[rChild].max_prefix_sum);
  49.         // segment[index].max_suffix_sum = max(segment[rChild].max_suffix_sum, segment[rChild].sum + segment[lChild].max_suffix_sum);
  50.         // segment[index].max_sum = max(segment[lChild].max_sum, max(segment[rChild].max_sum, segment[lChild].max_suffix_sum + segment[rChild].max_prefix_sum));
  51.         for (auto [key, val] : segment[lChild].mp)
  52.         {
  53.             segment[index].mp[key] += val;
  54.         }
  55.         for (auto [key, val] : segment[rChild].mp)
  56.         {
  57.             segment[index].mp[key] += val;
  58.         }
  59.     }
  60.  
  61.     obj query(int l, int r, int ql, int qr, int index)
  62.     {
  63.         // If the l and r lies inside queries range then that complete node is part of ans.
  64.         if (ql <= l && qr >= r)
  65.         {
  66.             return segment[index];
  67.         }
  68.  
  69.         int mid = (l + r) / 2;
  70.  
  71.         // If the leftChild has no overlapping with queries range then ans only lies in right part.
  72.         if (mid < ql)
  73.         {
  74.             return query(mid + 1, r, ql, qr, 2 * index + 2);
  75.         }
  76.  
  77.         // If the rightChild has no overlapping with queries range then ans only lies in left part.
  78.         if (mid + 1 > qr)
  79.         {
  80.             return query(l, mid, ql, qr, 2 * index + 1);
  81.         }
  82.  
  83.         obj ans1 = query(l, mid, ql, qr, 2 * index + 1);
  84.         obj ans2 = query(mid + 1, r, ql, qr, 2 * index + 2);
  85.  
  86.         obj ans;
  87.  
  88.         // Merging answer from left and right child.
  89.         // ans.sum = ans1.sum + ans2.sum;
  90.         // ans.max_sum = max(ans1.max_sum, max(ans2.max_sum, ans1.max_suffix_sum + ans2.max_prefix_sum));
  91.         // ans.max_prefix_sum = max(ans1.max_prefix_sum, ans1.sum + ans2.max_prefix_sum);
  92.         // ans.max_suffix_sum = max(ans2.max_suffix_sum, ans2.sum + ans1.max_suffix_sum);
  93.  
  94.         for (auto [key, val] : ans1.mp)
  95.         {
  96.             ans.mp[key] += val;
  97.         }
  98.         for (auto [key, val] : ans2.mp)
  99.         {
  100.             ans.mp[key] += val;
  101.         }
  102.  
  103.         return ans;
  104.     }
  105.  
  106.     obj query(int l, int r, int ql, int qr)
  107.     {
  108.         obj ans = query(l, r, ql, qr, 0);
  109.         return ans;
  110.     }
  111. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement