ADDED lib/dataStructure/segmentTree.cpp Index: lib/dataStructure/segmentTree.cpp ================================================================== --- lib/dataStructure/segmentTree.cpp +++ lib/dataStructure/segmentTree.cpp @@ -0,0 +1,110 @@ +//------------------------------------------------------------- +// Segment tree +// in some general form +// +// Verified by +// - Codeforces 104 E +//------------------------------------------------------------- + +class SegmentTree +{ + // --- DATA FOR EACH NODE --- + struct Node + { + int sum; + int maxLeft; + int minLeft; + int n4; + int n7; + bool switched; + }; + // --- DATA FOR EACH NODE --- + + Node Canonical(int lv, int idx) + { + Node& x = tree[lv][idx]; + // --- DO SOMETHING IF YOU NEED CANONICALIZATION --- + if( !x.switched ) + return x; + Node n = {-x.sum, -x.minLeft, -x.maxLeft, x.n7, x.n4, false}; + return n; + // --- DO SOMETHING IF YOU NEED CANONICALIZATION --- + } + + void UpdateMidNode(int lv, int idx) + { + Node l = Canonical(lv-1, idx*2); + Node r = Canonical(lv-1, idx*2+1); + // --- BOTTOM UP COMPUTATION --- + Node me = { + l.sum + r.sum, + max(l.maxLeft, l.sum+r.maxLeft), + min(l.minLeft, l.sum+r.minLeft), + l.n4 + r.n4, + l.n7 + r.n7, + false + }; + // --- BOTTOM UP COMPUTATION --- + tree[lv][idx] = me; + } + + vector< vector > tree; + +public: + SegmentTree(const string& s) + { + int N = 1; + while( N < s.size() ) + N <<= 1; + + tree.resize(tree.size()+1); tree.back().resize(N); + for(int i=0; i>=1) + { + tree.resize(tree.size()+1); tree.back().resize(N); + for(int i=0; i