/*
QUESTION 13: Uber OA — Maximum Sum of Two Separate Subtree XORs
Problem Statement:
You are given a rooted tree.
Every node has an integer value.
For each node u:
subtreeXor[u] is the XOR of all values in u's subtree.
Choose two nodes a and b such that their subtrees do not share any node.
Maximize:
subtreeXor[a] + subtreeXor[b]
Return that maximum value.
Hard Constraints:
1 <= N <= 200000
0 <= value[i] <= 1e9
Example:
values = [4, 6, 2, 9, 5]
edges:
1 - 2
1 - 3
2 - 4
2 - 5
Expected Output:
14
Explanation:
Choose subtree rooted at node 4 and subtree rooted at node 5.
Their XOR values are 9 and 5.
Sum = 14
Brute Force:
Compute subtree ranges using DFS.
Try every pair of nodes.
Check if their subtree intervals overlap.
Time Complexity:
O(N^2)
Optimized Approach:
During DFS, compute:
subtreeXor[u]
Also maintain:
bestSingle[u] = maximum subtree XOR inside subtree u
bestPair[u] = best sum of two non-overlapping subtree XORs inside subtree u
Different child branches of the same node are automatically non-overlapping.
Time Complexity:
O(N)
Space Complexity:
O(N)
*/
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
vector<vector<int>> tree;
vector<int> value;
vector<long long> subtreeXor;
vector<long long> bestSingle;
vector<long long> bestPair;
void dfs(int u, int parent) {
subtreeXor[u] = value[u];
for (int v : tree[u]) {
if (v == parent) continue;
dfs(v, u);
subtreeXor[u] ^= subtreeXor[v];
}
bestSingle[u] = subtreeXor[u];
bestPair[u] = -1;
long long bestSeenFromPreviousChild = -1;
for (int v : tree[u]) {
if (v == parent) continue;
bestPair[u] = max(bestPair[u], bestPair[v]);
if (bestSeenFromPreviousChild != -1) {
bestPair[u] = max(bestPair[u],
bestSeenFromPreviousChild + bestSingle[v]);
}
bestSeenFromPreviousChild =
max(bestSeenFromPreviousChild, bestSingle[v]);
bestSingle[u] = max(bestSingle[u], bestSingle[v]);
}
}
long long maxTwoSubtreeXor(vector<int>& values, vector<vector<int>>& edges) {
int n = values.size();
value = values;
tree.assign(n, {});
for (auto &e : edges) {
int u = e[0] - 1;
int v = e[1] - 1;
tree[u].push_back(v);
tree[v].push_back(u);
}
subtreeXor.assign(n, 0);
bestSingle.assign(n, 0);
bestPair.assign(n, -1);
dfs(0, -1);
return bestPair[0];
}
};
int main() {
Solution sol;
vector<int> values = {4, 6, 2, 9, 5};
vector<vector<int>> edges = {
{1, 2},
{1, 3},
{2, 4},
{2, 5}
};
cout << sol.maxTwoSubtreeXor(values, edges) << endl;
return 0;
}
LyoKUVVFU1RJT04gMTM6IFViZXIgT0Eg4oCUIE1heGltdW0gU3VtIG9mIFR3byBTZXBhcmF0ZSBTdWJ0cmVlIFhPUnMKClByb2JsZW0gU3RhdGVtZW50OgpZb3UgYXJlIGdpdmVuIGEgcm9vdGVkIHRyZWUuCkV2ZXJ5IG5vZGUgaGFzIGFuIGludGVnZXIgdmFsdWUuCgpGb3IgZWFjaCBub2RlIHU6CnN1YnRyZWVYb3JbdV0gaXMgdGhlIFhPUiBvZiBhbGwgdmFsdWVzIGluIHUncyBzdWJ0cmVlLgoKQ2hvb3NlIHR3byBub2RlcyBhIGFuZCBiIHN1Y2ggdGhhdCB0aGVpciBzdWJ0cmVlcyBkbyBub3Qgc2hhcmUgYW55IG5vZGUuCgpNYXhpbWl6ZToKc3VidHJlZVhvclthXSArIHN1YnRyZWVYb3JbYl0KClJldHVybiB0aGF0IG1heGltdW0gdmFsdWUuCgpIYXJkIENvbnN0cmFpbnRzOgoxIDw9IE4gPD0gMjAwMDAwCjAgPD0gdmFsdWVbaV0gPD0gMWU5CgpFeGFtcGxlOgp2YWx1ZXMgPSBbNCwgNiwgMiwgOSwgNV0KZWRnZXM6CjEgLSAyCjEgLSAzCjIgLSA0CjIgLSA1CgpFeHBlY3RlZCBPdXRwdXQ6CjE0CgpFeHBsYW5hdGlvbjoKQ2hvb3NlIHN1YnRyZWUgcm9vdGVkIGF0IG5vZGUgNCBhbmQgc3VidHJlZSByb290ZWQgYXQgbm9kZSA1LgpUaGVpciBYT1IgdmFsdWVzIGFyZSA5IGFuZCA1LgoKU3VtID0gMTQKCkJydXRlIEZvcmNlOgpDb21wdXRlIHN1YnRyZWUgcmFuZ2VzIHVzaW5nIERGUy4KVHJ5IGV2ZXJ5IHBhaXIgb2Ygbm9kZXMuCkNoZWNrIGlmIHRoZWlyIHN1YnRyZWUgaW50ZXJ2YWxzIG92ZXJsYXAuCgpUaW1lIENvbXBsZXhpdHk6Ck8oTl4yKQoKT3B0aW1pemVkIEFwcHJvYWNoOgpEdXJpbmcgREZTLCBjb21wdXRlOgpzdWJ0cmVlWG9yW3VdCgpBbHNvIG1haW50YWluOgpiZXN0U2luZ2xlW3VdID0gbWF4aW11bSBzdWJ0cmVlIFhPUiBpbnNpZGUgc3VidHJlZSB1CmJlc3RQYWlyW3VdID0gYmVzdCBzdW0gb2YgdHdvIG5vbi1vdmVybGFwcGluZyBzdWJ0cmVlIFhPUnMgaW5zaWRlIHN1YnRyZWUgdQoKRGlmZmVyZW50IGNoaWxkIGJyYW5jaGVzIG9mIHRoZSBzYW1lIG5vZGUgYXJlIGF1dG9tYXRpY2FsbHkgbm9uLW92ZXJsYXBwaW5nLgoKVGltZSBDb21wbGV4aXR5OgpPKE4pCgpTcGFjZSBDb21wbGV4aXR5OgpPKE4pCiovCgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIFNvbHV0aW9uIHsKcHVibGljOgogICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiB0cmVlOwogICAgdmVjdG9yPGludD4gdmFsdWU7CgogICAgdmVjdG9yPGxvbmcgbG9uZz4gc3VidHJlZVhvcjsKICAgIHZlY3Rvcjxsb25nIGxvbmc+IGJlc3RTaW5nbGU7CiAgICB2ZWN0b3I8bG9uZyBsb25nPiBiZXN0UGFpcjsKCiAgICB2b2lkIGRmcyhpbnQgdSwgaW50IHBhcmVudCkgewogICAgICAgIHN1YnRyZWVYb3JbdV0gPSB2YWx1ZVt1XTsKCiAgICAgICAgZm9yIChpbnQgdiA6IHRyZWVbdV0pIHsKICAgICAgICAgICAgaWYgKHYgPT0gcGFyZW50KSBjb250aW51ZTsKCiAgICAgICAgICAgIGRmcyh2LCB1KTsKICAgICAgICAgICAgc3VidHJlZVhvclt1XSBePSBzdWJ0cmVlWG9yW3ZdOwogICAgICAgIH0KCiAgICAgICAgYmVzdFNpbmdsZVt1XSA9IHN1YnRyZWVYb3JbdV07CiAgICAgICAgYmVzdFBhaXJbdV0gPSAtMTsKCiAgICAgICAgbG9uZyBsb25nIGJlc3RTZWVuRnJvbVByZXZpb3VzQ2hpbGQgPSAtMTsKCiAgICAgICAgZm9yIChpbnQgdiA6IHRyZWVbdV0pIHsKICAgICAgICAgICAgaWYgKHYgPT0gcGFyZW50KSBjb250aW51ZTsKCiAgICAgICAgICAgIGJlc3RQYWlyW3VdID0gbWF4KGJlc3RQYWlyW3VdLCBiZXN0UGFpclt2XSk7CgogICAgICAgICAgICBpZiAoYmVzdFNlZW5Gcm9tUHJldmlvdXNDaGlsZCAhPSAtMSkgewogICAgICAgICAgICAgICAgYmVzdFBhaXJbdV0gPSBtYXgoYmVzdFBhaXJbdV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0U2VlbkZyb21QcmV2aW91c0NoaWxkICsgYmVzdFNpbmdsZVt2XSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJlc3RTZWVuRnJvbVByZXZpb3VzQ2hpbGQgPQogICAgICAgICAgICAgICAgbWF4KGJlc3RTZWVuRnJvbVByZXZpb3VzQ2hpbGQsIGJlc3RTaW5nbGVbdl0pOwoKICAgICAgICAgICAgYmVzdFNpbmdsZVt1XSA9IG1heChiZXN0U2luZ2xlW3VdLCBiZXN0U2luZ2xlW3ZdKTsKICAgICAgICB9CiAgICB9CgogICAgbG9uZyBsb25nIG1heFR3b1N1YnRyZWVYb3IodmVjdG9yPGludD4mIHZhbHVlcywgdmVjdG9yPHZlY3RvcjxpbnQ+PiYgZWRnZXMpIHsKICAgICAgICBpbnQgbiA9IHZhbHVlcy5zaXplKCk7CgogICAgICAgIHZhbHVlID0gdmFsdWVzOwogICAgICAgIHRyZWUuYXNzaWduKG4sIHt9KTsKCiAgICAgICAgZm9yIChhdXRvICZlIDogZWRnZXMpIHsKICAgICAgICAgICAgaW50IHUgPSBlWzBdIC0gMTsKICAgICAgICAgICAgaW50IHYgPSBlWzFdIC0gMTsKCiAgICAgICAgICAgIHRyZWVbdV0ucHVzaF9iYWNrKHYpOwogICAgICAgICAgICB0cmVlW3ZdLnB1c2hfYmFjayh1KTsKICAgICAgICB9CgogICAgICAgIHN1YnRyZWVYb3IuYXNzaWduKG4sIDApOwogICAgICAgIGJlc3RTaW5nbGUuYXNzaWduKG4sIDApOwogICAgICAgIGJlc3RQYWlyLmFzc2lnbihuLCAtMSk7CgogICAgICAgIGRmcygwLCAtMSk7CgogICAgICAgIHJldHVybiBiZXN0UGFpclswXTsKICAgIH0KfTsKCmludCBtYWluKCkgewogICAgU29sdXRpb24gc29sOwoKICAgIHZlY3RvcjxpbnQ+IHZhbHVlcyA9IHs0LCA2LCAyLCA5LCA1fTsKCiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGVkZ2VzID0gewogICAgICAgIHsxLCAyfSwKICAgICAgICB7MSwgM30sCiAgICAgICAgezIsIDR9LAogICAgICAgIHsyLCA1fQogICAgfTsKCiAgICBjb3V0IDw8IHNvbC5tYXhUd29TdWJ0cmVlWG9yKHZhbHVlcywgZWRnZXMpIDw8IGVuZGw7CgogICAgcmV0dXJuIDA7Cn0=