#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
template < class S, class T> inline S min_L( S a,T b) {
return a<= b? a: b;
}
template < class S, class T> inline S max_L( S a,T b) {
return a>= b? a: b;
}
template < class S, class T> inline S chmax( S & a, T b) {
if ( a< b) {
a= b;
}
return a;
}
#define main dummy_main
int main( ) {
return 0 ;
}
#undef main
#define TreeNode dummy_TreeNode
struct TreeNode{
int val;
TreeNode * left;
TreeNode * right;
TreeNode( int x) : val( x) , left( NULL ) , right( NULL ) {
}
}
;
#undef TreeNode
long long res;
void solve( TreeNode * n, int & mn, int & mx, int & ok, long long & sm) {
int mn1;
int mx1;
int ok1;
long long sm1;
int mn2;
int mx2;
int ok2;
long long sm2;
if ( n == NULL ) {
mn = 1073709056 ;
mx = - 1073709056 ;
ok = 1 ;
sm = 0 ;
return ;
}
solve( n- > left, mn1, mx1, ok1, sm1) ;
solve( n- > right, mn2, mx2, ok2, sm2) ;
mn = min_L( min_L( mn1, mn2) , n- > val) ;
mx = max_L( max_L( mx1, mx2) , n- > val) ;
ok = ( ok1 && ok2) ;
if ( mx1 >= n- > val) {
ok = 0 ;
}
if ( mn2 <= n- > val) {
ok = 0 ;
}
sm = sm1 + sm2 + n- > val;
if ( ok) {
chmax( res, sm) ;
}
}
class Solution{
public :
int maxSumBST( TreeNode* root) {
int mn;
int mx;
int ok;
long long sm;
res = 0 ;
solve( root, mn, mx, ok, sm) ;
return res;
}
}
;
// cLay varsion 20200308-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// #define TreeNode dummy_TreeNode
// struct TreeNode {
// int val;
// TreeNode *left;
// TreeNode *right;
// TreeNode(int x) : val(x), left(NULL), right(NULL) {}
// };
// #undef TreeNode
//
// ll res;
//
// void solve(TreeNode *n, int &mn, int &mx, int &ok, ll &sm){
// int mn1, mx1, ok1; ll sm1;
// int mn2, mx2, ok2; ll sm2;
//
// if(n == NULL){
// mn = int_inf;
// mx = -int_inf;
// ok = 1;
// sm = 0;
// return;
// }
//
// solve(n->left, mn1, mx1, ok1, sm1);
// solve(n->right, mn2, mx2, ok2, sm2);
//
// mn = min(mn1, mn2, n->val);
// mx = max(mx1, mx2, n->val);
// ok = (ok1 && ok2);
// if(mx1 >= n->val) ok = 0;
// if(mn2 <= n->val) ok = 0;
// sm = sm1 + sm2 + n->val;
//
// if(ok) res >?= sm;
// }
//
// class Solution {
// public:
// int maxSumBST(TreeNode* root) {
// int mn, mx, ok; ll sm;
// res = 0;
// solve(root, mn, mx, ok, sm);
// return res;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnRlbXBsYXRlPGNsYXNzIFMsIGNsYXNzIFQ+IGlubGluZSBTIG1pbl9MKFMgYSxUIGIpewogIHJldHVybiBhPD1iP2E6YjsKfQp0ZW1wbGF0ZTxjbGFzcyBTLCBjbGFzcyBUPiBpbmxpbmUgUyBtYXhfTChTIGEsVCBiKXsKICByZXR1cm4gYT49Yj9hOmI7Cn0KdGVtcGxhdGU8Y2xhc3MgUywgY2xhc3MgVD4gaW5saW5lIFMgY2htYXgoUyAmYSwgVCBiKXsKICBpZihhPGIpewogICAgYT1iOwogIH0KICByZXR1cm4gYTsKfQojZGVmaW5lIG1haW4gZHVtbXlfbWFpbgppbnQgbWFpbigpewogIHJldHVybiAwOwp9CiN1bmRlZiBtYWluCiNkZWZpbmUgVHJlZU5vZGUgZHVtbXlfVHJlZU5vZGUKc3RydWN0IFRyZWVOb2RlewogIGludCB2YWw7CiAgVHJlZU5vZGUgKmxlZnQ7CiAgVHJlZU5vZGUgKnJpZ2h0OwogIFRyZWVOb2RlKGludCB4KSA6IHZhbCh4KSwgbGVmdChOVUxMKSwgcmlnaHQoTlVMTCl7CiAgfQp9CjsKI3VuZGVmIFRyZWVOb2RlCmxvbmcgbG9uZyByZXM7CnZvaWQgc29sdmUoVHJlZU5vZGUgKm4sIGludCAmbW4sIGludCAmbXgsIGludCAmb2ssIGxvbmcgbG9uZyAmc20pewogIGludCBtbjE7CiAgaW50IG14MTsKICBpbnQgb2sxOwogIGxvbmcgbG9uZyBzbTE7CiAgaW50IG1uMjsKICBpbnQgbXgyOwogIGludCBvazI7CiAgbG9uZyBsb25nIHNtMjsKICBpZihuID09IE5VTEwpewogICAgbW4gPSAxMDczNzA5MDU2OwogICAgbXggPSAtMTA3MzcwOTA1NjsKICAgIG9rID0gMTsKICAgIHNtID0gMDsKICAgIHJldHVybjsKICB9CiAgc29sdmUobi0+bGVmdCwgbW4xLCBteDEsIG9rMSwgc20xKTsKICBzb2x2ZShuLT5yaWdodCwgbW4yLCBteDIsIG9rMiwgc20yKTsKICBtbiA9bWluX0wobWluX0wobW4xLCBtbjIpLCBuLT52YWwpOwogIG14ID1tYXhfTChtYXhfTChteDEsIG14MiksIG4tPnZhbCk7CiAgb2sgPSAob2sxICYmIG9rMik7CiAgaWYobXgxID49IG4tPnZhbCl7CiAgICBvayA9IDA7CiAgfQogIGlmKG1uMiA8PSBuLT52YWwpewogICAgb2sgPSAwOwogIH0KICBzbSA9IHNtMSArIHNtMiArIG4tPnZhbDsKICBpZihvayl7CiAgICBjaG1heChyZXMsIHNtKTsKICB9Cn0KY2xhc3MgU29sdXRpb257CiAgcHVibGljOgogIGludCBtYXhTdW1CU1QoVHJlZU5vZGUqIHJvb3QpewogICAgaW50IG1uOwogICAgaW50IG14OwogICAgaW50IG9rOwogICAgbG9uZyBsb25nIHNtOwogICAgcmVzID0gMDsKICAgIHNvbHZlKHJvb3QsIG1uLCBteCwgb2ssIHNtKTsKICAgIHJldHVybiByZXM7CiAgfQp9CjsKLy8gY0xheSB2YXJzaW9uIDIwMjAwMzA4LTEKCi8vIC0tLSBvcmlnaW5hbCBjb2RlIC0tLQovLyAjZGVmaW5lIG1haW4gZHVtbXlfbWFpbgovLyB7fQovLyAjdW5kZWYgbWFpbgovLyAKLy8gI2RlZmluZSBUcmVlTm9kZSBkdW1teV9UcmVlTm9kZQovLyBzdHJ1Y3QgVHJlZU5vZGUgewovLyAgIGludCB2YWw7Ci8vICAgVHJlZU5vZGUgKmxlZnQ7Ci8vICAgVHJlZU5vZGUgKnJpZ2h0OwovLyAgIFRyZWVOb2RlKGludCB4KSA6IHZhbCh4KSwgbGVmdChOVUxMKSwgcmlnaHQoTlVMTCkge30KLy8gfTsKLy8gI3VuZGVmIFRyZWVOb2RlCi8vIAovLyBsbCByZXM7Ci8vIAovLyB2b2lkIHNvbHZlKFRyZWVOb2RlICpuLCBpbnQgJm1uLCBpbnQgJm14LCBpbnQgJm9rLCBsbCAmc20pewovLyAgIGludCBtbjEsIG14MSwgb2sxOyBsbCBzbTE7Ci8vICAgaW50IG1uMiwgbXgyLCBvazI7IGxsIHNtMjsKLy8gCi8vICAgaWYobiA9PSBOVUxMKXsKLy8gICAgIG1uID0gaW50X2luZjsKLy8gICAgIG14ID0gLWludF9pbmY7Ci8vICAgICBvayA9IDE7Ci8vICAgICBzbSA9IDA7Ci8vICAgICByZXR1cm47Ci8vICAgfQovLyAKLy8gICBzb2x2ZShuLT5sZWZ0LCBtbjEsIG14MSwgb2sxLCBzbTEpOwovLyAgIHNvbHZlKG4tPnJpZ2h0LCBtbjIsIG14Miwgb2syLCBzbTIpOwovLyAKLy8gICBtbiA9IG1pbihtbjEsIG1uMiwgbi0+dmFsKTsKLy8gICBteCA9IG1heChteDEsIG14Miwgbi0+dmFsKTsKLy8gICBvayA9IChvazEgJiYgb2syKTsKLy8gICBpZihteDEgPj0gbi0+dmFsKSBvayA9IDA7Ci8vICAgaWYobW4yIDw9IG4tPnZhbCkgb2sgPSAwOwovLyAgIHNtID0gc20xICsgc20yICsgbi0+dmFsOwovLyAKLy8gICBpZihvaykgcmVzID4/PSBzbTsKLy8gfQovLyAKLy8gY2xhc3MgU29sdXRpb24gewovLyBwdWJsaWM6Ci8vICAgaW50IG1heFN1bUJTVChUcmVlTm9kZSogcm9vdCkgewovLyAgICAgaW50IG1uLCBteCwgb2s7IGxsIHNtOwovLyAgICAgcmVzID0gMDsKLy8gICAgIHNvbHZlKHJvb3QsIG1uLCBteCwgb2ssIHNtKTsKLy8gICAgIHJldHVybiByZXM7Ci8vICAgfQovLyB9Owo=
compilation info
prog.cpp:32:12: error: variable or field ‘solve’ declared void
void solve(TreeNode *n, int &mn, int &mx, int &ok, long long &sm){
^~~~~~~~
prog.cpp:32:12: error: ‘TreeNode’ was not declared in this scope
prog.cpp:32:12: note: suggested alternative: ‘remove’
void solve(TreeNode *n, int &mn, int &mx, int &ok, long long &sm){
^~~~~~~~
remove
prog.cpp:32:22: error: ‘n’ was not declared in this scope
void solve(TreeNode *n, int &mn, int &mx, int &ok, long long &sm){
^
prog.cpp:32:22: note: suggested alternative: ‘yn’
void solve(TreeNode *n, int &mn, int &mx, int &ok, long long &sm){
^
yn
prog.cpp:32:25: error: expected primary-expression before ‘int’
void solve(TreeNode *n, int &mn, int &mx, int &ok, long long &sm){
^~~
prog.cpp:32:34: error: expected primary-expression before ‘int’
void solve(TreeNode *n, int &mn, int &mx, int &ok, long long &sm){
^~~
prog.cpp:32:43: error: expected primary-expression before ‘int’
void solve(TreeNode *n, int &mn, int &mx, int &ok, long long &sm){
^~~
prog.cpp:32:52: error: expected primary-expression before ‘long’
void solve(TreeNode *n, int &mn, int &mx, int &ok, long long &sm){
^~~~
prog.cpp:66:17: error: ‘TreeNode’ has not been declared
int maxSumBST(TreeNode* root){
^~~~~~~~
prog.cpp: In member function ‘int Solution::maxSumBST(int*)’:
prog.cpp:72:5: error: ‘solve’ was not declared in this scope
solve(root, mn, mx, ok, sm);
^~~~~
stdout