// lazy part is pending -> other code is fine
class SGtree
{
vi seg, lazy;
public :
SGtree( int n)
{
// Adjust deafault value (if needed) --> size = [4*arr.size()]
seg.resize ( 4 * n + 1 , 0 ) ;
lazy.resize ( 4 * n + 1 , 0 ) ;
}
void build( vi & arr, int l, int r, int ind)
{
if ( l == r)
{
// Change accordingly (for single element)
seg[ ind] = arr[ l] ;
return ;
}
int mid = ( l + r) / 2 ;
build( arr, l, mid, 2 * ind + 1 ) ;
build( arr, mid + 1 , r, 2 * ind + 2 ) ;
// Assuming operation is sum of range[l, r]
seg[ ind] = seg[ 2 * ind + 1 ] + seg[ 2 * ind + 2 ] ;
}
// query on [l, r] where l and r are fixed
int tell( int l, int r, int a, int b, int ind)
{
// Adjust deafault value of lazy (if needed)
if ( lazy[ ind] )
{
if ( a ! = b)
{
// if (a!=b) -> not leaf -> have childs
lazy[ 2 * ind + 1 ] = lazy[ ind] ;
lazy[ 2 * ind + 2 ] = lazy[ ind] ;
}
// Assuming operation is sum of range[l, r]
// Update accordingly -> added val (b-a+1) times {bcz sum query on index[a...b]}
seg[ ind] + = lazy[ ind] * ( b - a + 1 ) ;
lazy[ ind] = 0 ; // Adjust deafault value of lazy (if needed)
}
if ( l <= a && b <= r)
{
return seg[ ind] ;
}
if ( r < a || b < l) // NO overlap
{
// Return the default value
return 0 ;
}
int mid = ( a + b) / 2 ;
int x = tell( l, r, a, mid, 2 * ind + 1 ) ;
int y = tell( l, r, mid + 1 , b, 2 * ind + 2 ) ;
// Do the operation
return x + y;
}
// point update of arr[x] = val
void update( int l, int r, int ind, int x, int val)
{
if ( l == r)
{
seg[ ind] = val;
return ;
}
int mid = ( l + r) / 2 ;
if ( x <= mid)
{
update( l, mid, 2 * ind + 1 , x, val) ;
}
else
{
update( mid + 1 , r, 2 * ind + 2 , x, val) ;
}
// Assuming operation is sum of range[l, r]
seg[ ind] = seg[ 2 * ind + 1 ] + seg[ 2 * ind + 2 ] ;
}
// range update from {arr[l].....arr[r]} to val
void lazyPropagation( int l, int r, int a, int b, int ind, int val)
{
if ( l <= a && b <= r)
{
// If 2 consecutive updates on same node
lazy[ ind] + = val;
cout << lazy[ ind] << " " << ind << " " << a << " " << b << endl;
return ;
}
if ( r < a || b < l) // NO overlap
{
return ;
}
int mid = ( a + b) / 2 ;
lazyPropagation( l, r, a, mid, 2 * ind + 1 , val) ;
lazyPropagation( l, r, mid + 1 , b, 2 * ind + 2 , val) ;
}
} ;
Ly8gbGF6eSBwYXJ0IGlzIHBlbmRpbmcgLT4gb3RoZXIgY29kZSBpcyBmaW5lCmNsYXNzIFNHdHJlZQp7CiAgICB2aSBzZWcsIGxhenk7CgpwdWJsaWM6CiAgICBTR3RyZWUoaW50IG4pCiAgICB7CiAgICAgICAgLy8gQWRqdXN0IGRlYWZhdWx0IHZhbHVlIChpZiBuZWVkZWQpIC0tPiBzaXplID0gWzQqYXJyLnNpemUoKV0KICAgICAgICBzZWcucmVzaXplKDQgKiBuICsgMSwgMCk7CiAgICAgICAgbGF6eS5yZXNpemUoNCAqIG4gKyAxLCAwKTsKICAgIH0KCiAgICB2b2lkIGJ1aWxkKHZpICZhcnIsIGludCBsLCBpbnQgciwgaW50IGluZCkKICAgIHsKICAgICAgICBpZiAobCA9PSByKQogICAgICAgIHsKICAgICAgICAgICAgLy8gQ2hhbmdlIGFjY29yZGluZ2x5IChmb3Igc2luZ2xlIGVsZW1lbnQpCiAgICAgICAgICAgIHNlZ1tpbmRdID0gYXJyW2xdOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpbnQgbWlkID0gKGwgKyByKSAvIDI7CiAgICAgICAgYnVpbGQoYXJyLCBsLCBtaWQsIDIgKiBpbmQgKyAxKTsKICAgICAgICBidWlsZChhcnIsIG1pZCArIDEsIHIsIDIgKiBpbmQgKyAyKTsKCiAgICAgICAgLy8gQXNzdW1pbmcgb3BlcmF0aW9uIGlzIHN1bSBvZiByYW5nZVtsLCByXQogICAgICAgIHNlZ1tpbmRdID0gc2VnWzIgKiBpbmQgKyAxXSArIHNlZ1syICogaW5kICsgMl07CiAgICB9CgogICAgLy8gcXVlcnkgb24gW2wsIHJdIHdoZXJlIGwgYW5kIHIgYXJlIGZpeGVkCiAgICBpbnQgdGVsbChpbnQgbCwgaW50IHIsIGludCBhLCBpbnQgYiwgaW50IGluZCkKICAgIHsKICAgICAgICAvLyBBZGp1c3QgZGVhZmF1bHQgdmFsdWUgb2YgbGF6eSAoaWYgbmVlZGVkKQogICAgICAgIGlmIChsYXp5W2luZF0pCiAgICAgICAgewogICAgICAgICAgICBpZiAoYSAhPSBiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiAoYSE9YikgLT4gbm90IGxlYWYgLT4gaGF2ZSBjaGlsZHMKICAgICAgICAgICAgICAgIGxhenlbMiAqIGluZCArIDFdID0gbGF6eVtpbmRdOwogICAgICAgICAgICAgICAgbGF6eVsyICogaW5kICsgMl0gPSBsYXp5W2luZF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEFzc3VtaW5nIG9wZXJhdGlvbiBpcyBzdW0gb2YgcmFuZ2VbbCwgcl0KICAgICAgICAgICAgLy8gVXBkYXRlIGFjY29yZGluZ2x5IC0+IGFkZGVkIHZhbCAoYi1hKzEpIHRpbWVzIHtiY3ogc3VtIHF1ZXJ5IG9uIGluZGV4W2EuLi5iXX0KICAgICAgICAgICAgc2VnW2luZF0gKz0gbGF6eVtpbmRdICogKGIgLSBhICsgMSk7CgogICAgICAgICAgICBsYXp5W2luZF0gPSAwOyAvLyBBZGp1c3QgZGVhZmF1bHQgdmFsdWUgb2YgbGF6eSAoaWYgbmVlZGVkKQogICAgICAgIH0KCiAgICAgICAgaWYgKGwgPD0gYSAmJiBiIDw9IHIpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gc2VnW2luZF07CiAgICAgICAgfQoKICAgICAgICBpZiAociA8IGEgfHwgYiA8IGwpIC8vIE5PIG92ZXJsYXAKICAgICAgICB7CiAgICAgICAgICAgIC8vIFJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgIGludCBtaWQgPSAoYSArIGIpIC8gMjsKICAgICAgICBpbnQgeCA9IHRlbGwobCwgciwgYSwgbWlkLCAyICogaW5kICsgMSk7CiAgICAgICAgaW50IHkgPSB0ZWxsKGwsIHIsIG1pZCArIDEsIGIsIDIgKiBpbmQgKyAyKTsKCiAgICAgICAgLy8gRG8gdGhlIG9wZXJhdGlvbgogICAgICAgIHJldHVybiB4ICsgeTsKICAgIH0KCiAgICAvLyBwb2ludCB1cGRhdGUgb2YgYXJyW3hdID0gdmFsCiAgICB2b2lkIHVwZGF0ZShpbnQgbCwgaW50IHIsIGludCBpbmQsIGludCB4LCBpbnQgdmFsKQogICAgewogICAgICAgIGlmIChsID09IHIpCiAgICAgICAgewogICAgICAgICAgICBzZWdbaW5kXSA9IHZhbDsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaW50IG1pZCA9IChsICsgcikgLyAyOwogICAgICAgIGlmICh4IDw9IG1pZCkKICAgICAgICB7CiAgICAgICAgICAgIHVwZGF0ZShsLCBtaWQsIDIgKiBpbmQgKyAxLCB4LCB2YWwpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB1cGRhdGUobWlkICsgMSwgciwgMiAqIGluZCArIDIsIHgsIHZhbCk7CiAgICAgICAgfQoKICAgICAgICAvLyBBc3N1bWluZyBvcGVyYXRpb24gaXMgc3VtIG9mIHJhbmdlW2wsIHJdCiAgICAgICAgc2VnW2luZF0gPSBzZWdbMiAqIGluZCArIDFdICsgc2VnWzIgKiBpbmQgKyAyXTsKICAgIH0KCiAgICAvLyByYW5nZSB1cGRhdGUgZnJvbSB7YXJyW2xdLi4uLi5hcnJbcl19IHRvIHZhbAogICAgdm9pZCBsYXp5UHJvcGFnYXRpb24oaW50IGwsIGludCByLCBpbnQgYSwgaW50IGIsIGludCBpbmQsIGludCB2YWwpCiAgICB7CiAgICAgICAgaWYgKGwgPD0gYSAmJiBiIDw9IHIpCiAgICAgICAgewogICAgICAgICAgICAvLyBJZiAyIGNvbnNlY3V0aXZlIHVwZGF0ZXMgb24gc2FtZSBub2RlCiAgICAgICAgICAgIGxhenlbaW5kXSArPSB2YWw7CiAgICAgICAgICAgIGNvdXQgPDwgbGF6eVtpbmRdIDw8ICIgIiA8PCBpbmQgPDwgIiAiIDw8IGEgPDwgIiAiIDw8IGIgPDwgZW5kbDsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKHIgPCBhIHx8IGIgPCBsKSAvLyBOTyBvdmVybGFwCiAgICAgICAgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpbnQgbWlkID0gKGEgKyBiKSAvIDI7CiAgICAgICAgbGF6eVByb3BhZ2F0aW9uKGwsIHIsIGEsIG1pZCwgMiAqIGluZCArIDEsIHZhbCk7CiAgICAgICAgbGF6eVByb3BhZ2F0aW9uKGwsIHIsIG1pZCArIDEsIGIsIDIgKiBpbmQgKyAyLCB2YWwpOwogICAgfQp9Owo=
compilation info
prog.cpp:4:5: error: ‘vi’ does not name a type; did you mean ‘void’?
vi seg, lazy;
^~
void
prog.cpp:14:16: error: ‘vi’ has not been declared
void build(vi &arr, int l, int r, int ind)
^~
prog.cpp: In constructor ‘SGtree::SGtree(int)’:
prog.cpp:10:9: error: ‘seg’ was not declared in this scope
seg.resize(4 * n + 1, 0);
^~~
prog.cpp:11:9: error: ‘lazy’ was not declared in this scope
lazy.resize(4 * n + 1, 0);
^~~~
prog.cpp: In member function ‘void SGtree::build(int&, int, int, int)’:
prog.cpp:19:13: error: ‘seg’ was not declared in this scope
seg[ind] = arr[l];
^~~
prog.cpp:19:29: error: invalid types ‘int[int]’ for array subscript
seg[ind] = arr[l];
^
prog.cpp:28:9: error: ‘seg’ was not declared in this scope
seg[ind] = seg[2 * ind + 1] + seg[2 * ind + 2];
^~~
prog.cpp: In member function ‘int SGtree::tell(int, int, int, int, int)’:
prog.cpp:35:13: error: ‘lazy’ was not declared in this scope
if (lazy[ind])
^~~~
prog.cpp:46:13: error: ‘seg’ was not declared in this scope
seg[ind] += lazy[ind] * (b - a + 1);
^~~
prog.cpp:53:20: error: ‘seg’ was not declared in this scope
return seg[ind];
^~~
prog.cpp: In member function ‘void SGtree::update(int, int, int, int, int)’:
prog.cpp:75:13: error: ‘seg’ was not declared in this scope
seg[ind] = val;
^~~
prog.cpp:90:9: error: ‘seg’ was not declared in this scope
seg[ind] = seg[2 * ind + 1] + seg[2 * ind + 2];
^~~
prog.cpp: In member function ‘void SGtree::lazyPropagation(int, int, int, int, int, int)’:
prog.cpp:99:13: error: ‘lazy’ was not declared in this scope
lazy[ind] += val;
^~~~
prog.cpp:100:13: error: ‘cout’ was not declared in this scope
cout << lazy[ind] << " " << ind << " " << a << " " << b << endl;
^~~~
prog.cpp:100:72: error: ‘endl’ was not declared in this scope
cout << lazy[ind] << " " << ind << " " << a << " " << b << endl;
^~~~
prog.cpp:100:72: note: suggested alternative: ‘ind’
cout << lazy[ind] << " " << ind << " " << a << " " << b << endl;
^~~~
ind
stdout