Regular segment Tree usage. should be medium though.
structnode{Node (intRsintre): S (rs), E (re), left (nullptr), right (nullptr) {}ints; inte; Long Longsum; Node*Left ; Node*Right ;};classSolution {Node*Root; Public: /** * @param a:an integer vector*/Node* _build (intSintE, vector<int> &A) {if(S > E)returnnullptr; Node*p =NewNode (S, e); if(s = =e) {p->sum =A[s]; returnp; } intMid = (s + e)/2; P->left =_build (S, Mid, A); P->right= _build (mid+1, E, A); P->sum = P->left->sum + p->right->sum; returnp; } solution (Vector<int>A) {root= _build (0, A.size ()-1, A); } /** * @param start, end:indices * @return: The sum from start to end*/ Long Long_query (Node *p,intStartintend) { if(Start = = P->s && end = = p->e) {returnP->sum; } intMid = (p->s + p->e)/2; if(End <=mid) {return_query (p->Left , start, end); } Else if(Start >mid) {return_query (p->Right , start, end); } Long LongRL = _query (p->Left , start, mid); Long Longrr = _query (p->right,mid+1, end); returnRL +RR; } Long LongQueryintStartintend) { return_query (root, start, end); } /** * @param index, value:modify A[index] to value. */ int_modify (Node *p,intIintval) { if(P->s = = P->e && i = = p->s) {intD = val-p->sum; P->sum =Val; returnD; } intMid = (p->s + p->e)/2; intD =0; if(I <=mid) {D= _modify (p->Left , I, Val); } Else{d= _modify (p->Right,i, Val); } P->sum + =D; returnD; } voidModifyintIndexintvalue) {_modify (root, index, value); }};
View Code
Lintcode "Interval Sum II"