#include <bits/stdc++.h>
using namespace std ;
class SegmentTree {
private :
int n ;
vector< int > seg ;
vector< int > lazy ;
public :
SegmentTree( int n) {
this - > n = n ;
seg.resize ( ( n << 2 ) + 1 , 0 ) ;
lazy.resize ( ( n << 2 ) + 1 , 0 ) ;
}
void build( int ind , int low , int high , vector< int > & arr) {
if ( low == high) {
seg[ ind] = arr[ low] ;
return ;
}
int mid = low + ( ( high - low) / 2 ) ;
build( ( ind << 1 ) + 1 , low , mid , arr) ;
build( ( ind << 1 ) + 2 , mid + 1 , high , arr) ;
seg[ ind] = seg[ ( ind << 1 ) + 1 ] + seg[ ( ind << 1 ) + 2 ] ;
}
int query( int ind , int qsi , int qei , int low , int high) {
if ( lazy[ ind] ! = 0 ) {
seg[ ind] + = ( high - low + 1 ) * lazy[ ind] ;
if ( low ! = high) {
lazy[ ( ind << 1 ) + 1 ] + = lazy[ ind] ;
lazy[ ( ind << 1 ) + 2 ] + = lazy[ ind] ;
}
lazy[ ind] = 0 ;
}
// Case-1: No Overlap
if ( high < qsi || low > qei) {
return 0 ;
}
// Case-2: Complete Overlap
if ( low >= qsi && high <= qei) {
return seg[ ind] ;
}
// Case-3: Partial Overlap
int mid = low + ( ( high - low) / 2 ) ;
int left = query( ( ind << 1 ) + 1 , qsi , qei , low , mid) ;
int right = query( ( ind << 1 ) + 2 , qsi , qei , mid + 1 , high) ;
return left + right ;
}
int query( int qsi , int qei) {
return query( 0 , qsi , qei , 0 , n - 1 ) ;
}
void pointUpdate( int updateInd , int val) {
int curr = query( updateInd , updateInd) ;
rangeUpdate( updateInd , updateInd , val - curr) ;
}
void rangeUpdate( int ind , int rangeLeft , int rangeRight , int inc , int low , int high) {
// Update pending update if we visit the node think greedily that if we are visiting the node then update it naa in O(1) time so that in future we don't want to come specially to update it
if ( lazy[ ind] ! = 0 ) {
seg[ ind] + = ( high - low + 1 ) * lazy[ ind] ;
// Propogate the updates down
if ( low ! = high) {
lazy[ ( ind << 1 ) + 1 ] + = lazy[ ind] ;
lazy[ ( ind << 1 ) + 2 ] + = lazy[ ind] ;
}
lazy[ ind] = 0 ;
}
if ( high < rangeLeft || low > rangeRight) {
return ;
}
if ( low >= rangeLeft && high <= rangeRight) {
seg[ ind] + = ( high - low + 1 ) * inc ;
if ( low ! = high) {
lazy[ ( ind << 1 ) + 1 ] + = inc ;
lazy[ ( ind << 1 ) + 2 ] + = inc ;
}
return ;
}
int mid = low + ( ( high - low) / 2 ) ;
rangeUpdate( ( ind << 1 ) + 1 , rangeLeft , rangeRight , inc , low , mid) ;
rangeUpdate( ( ind << 1 ) + 2 , rangeLeft , rangeRight , inc , mid + 1 , high) ;
seg[ ind] = seg[ ( ind << 1 ) + 1 ] + seg[ ( ind << 1 ) + 2 ] ;
}
void rangeUpdate( int rangeLeft , int rangeRight , int inc) {
rangeUpdate( 0 , rangeLeft , rangeRight , inc , 0 , n - 1 ) ;
}
} ;
void solve( ) {
int n ; cin >> n ;
vector< int > arr( n) ;
for ( int i = 0 ; i < n ; i++ ) {
cin >> arr[ i] ;
}
SegmentTree st( n) ;
st.build ( 0 , 0 , n - 1 , arr) ;
int q ; cin >> q ;
for ( int Q = 0 ; Q < q ; Q++ ) {
int type ; cin >> type ;
// Type-1: Query
if ( type == 1 ) {
int l , r ; cin >> l >> r ;
cout << st.query ( l , r) << endl ;
}
// Type-2: Point Update
else if ( type == 2 ) {
int ind , val ; cin >> ind >> val ;
st.pointUpdate ( ind , val) ;
}
// Type-3: Range Update
else if ( type == 3 ) {
int l , r , inc ; cin >> l >> r >> inc ;
st.rangeUpdate ( l , r , inc) ;
}
}
}
int main( ) {
// freopen("input.txt" , "r" , stdin) ;
// freopen("output.txt" , "w" , stdout) ;
int t ; cin >> t ;
while ( t-- ) {
solve( ) ;
}
return 0 ;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQgOwoKY2xhc3MgU2VnbWVudFRyZWUgewpwcml2YXRlOgogICAgaW50IG4gOwogICAgdmVjdG9yPGludD4gc2VnIDsKICAgIHZlY3RvcjxpbnQ+IGxhenkgOwoKcHVibGljOgogICAgU2VnbWVudFRyZWUoaW50IG4pIHsKICAgICAgICB0aGlzIC0+IG4gPSBuIDsKICAgICAgICBzZWcucmVzaXplKChuIDw8IDIpICsgMSAsIDApIDsKICAgICAgICBsYXp5LnJlc2l6ZSgobiA8PCAyKSArIDEgLCAwKSA7CiAgICB9CgogICAgdm9pZCBidWlsZChpbnQgaW5kICwgaW50IGxvdyAsIGludCBoaWdoICwgdmVjdG9yPGludD4mIGFycikgewogICAgICAgIGlmKGxvdyA9PSBoaWdoKSB7CiAgICAgICAgICAgIHNlZ1tpbmRdID0gYXJyW2xvd10gOwogICAgICAgICAgICByZXR1cm4gOwogICAgICAgIH0KCiAgICAgICAgaW50IG1pZCA9IGxvdyArICgoaGlnaCAtIGxvdykgLyAyKSA7CiAgICAgICAgYnVpbGQoKGluZCA8PCAxKSArIDEgLCBsb3cgLCBtaWQgLCBhcnIpIDsKICAgICAgICBidWlsZCgoaW5kIDw8IDEpICsgMiAsIG1pZCArIDEgLCBoaWdoICwgYXJyKSA7CiAgICAgICAgc2VnW2luZF0gPSBzZWdbKGluZCA8PCAxKSArIDFdICsgc2VnWyhpbmQgPDwgMSkgKyAyXSA7CiAgICB9CgogICAgaW50IHF1ZXJ5KGludCBpbmQgLCBpbnQgcXNpICwgaW50IHFlaSAsIGludCBsb3cgLCBpbnQgaGlnaCkgewogICAgICAgIGlmIChsYXp5W2luZF0gIT0gMCkgewogICAgICAgICAgICBzZWdbaW5kXSArPSAoaGlnaCAtIGxvdyArIDEpICogbGF6eVtpbmRdOwoKICAgICAgICAgICAgaWYgKGxvdyAhPSBoaWdoKSB7CiAgICAgICAgICAgICAgICBsYXp5WyhpbmQgPDwgMSkgKyAxXSArPSBsYXp5W2luZF07CiAgICAgICAgICAgICAgICBsYXp5WyhpbmQgPDwgMSkgKyAyXSArPSBsYXp5W2luZF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxhenlbaW5kXSA9IDA7CiAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgLy8gQ2FzZS0xOiBObyBPdmVybGFwCiAgICAgICAgaWYoaGlnaCA8IHFzaSB8fCBsb3cgPiBxZWkpIHsKICAgICAgICAgICAgcmV0dXJuIDAgOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2FzZS0yOiBDb21wbGV0ZSBPdmVybGFwCiAgICAgICAgaWYobG93ID49IHFzaSAmJiBoaWdoIDw9IHFlaSkgewogICAgICAgICAgICByZXR1cm4gc2VnW2luZF0gOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2FzZS0zOiBQYXJ0aWFsIE92ZXJsYXAKICAgICAgICBpbnQgbWlkID0gbG93ICsgKChoaWdoIC0gbG93KSAvIDIpIDsKICAgICAgICBpbnQgbGVmdCA9IHF1ZXJ5KChpbmQgPDwgMSkgKyAxICwgcXNpICwgcWVpICwgbG93ICwgbWlkKSA7CiAgICAgICAgaW50IHJpZ2h0ID0gcXVlcnkoKGluZCA8PCAxKSArIDIgLCBxc2kgLCBxZWkgLCBtaWQgKyAxICwgaGlnaCkgOwogICAgICAgIHJldHVybiBsZWZ0ICsgcmlnaHQgOwogICAgfQoKICAgIGludCBxdWVyeShpbnQgcXNpICwgaW50IHFlaSkgewogICAgICAgIHJldHVybiBxdWVyeSgwICwgcXNpICwgcWVpICwgMCAsIG4gLSAxKSA7CiAgICB9CgogICAgdm9pZCBwb2ludFVwZGF0ZShpbnQgdXBkYXRlSW5kICwgaW50IHZhbCkgewogICAgICAgIGludCBjdXJyID0gcXVlcnkodXBkYXRlSW5kICwgdXBkYXRlSW5kKSA7CiAgICAgICAgcmFuZ2VVcGRhdGUodXBkYXRlSW5kICwgdXBkYXRlSW5kICwgdmFsIC0gY3VycikgOwogICAgfQoKICAgIHZvaWQgcmFuZ2VVcGRhdGUoaW50IGluZCAsIGludCByYW5nZUxlZnQgLCBpbnQgcmFuZ2VSaWdodCAsIGludCBpbmMgLCBpbnQgbG93ICwgaW50IGhpZ2gpIHsKICAgICAgICAvLyBVcGRhdGUgcGVuZGluZyB1cGRhdGUgaWYgd2UgdmlzaXQgdGhlIG5vZGUgdGhpbmsgZ3JlZWRpbHkgdGhhdCBpZiB3ZSBhcmUgdmlzaXRpbmcgdGhlIG5vZGUgdGhlbiB1cGRhdGUgaXQgbmFhIGluIE8oMSkgdGltZSBzbyB0aGF0IGluIGZ1dHVyZSB3ZSBkb24ndCB3YW50IHRvIGNvbWUgc3BlY2lhbGx5IHRvIHVwZGF0ZSBpdAogICAgICAgIGlmKGxhenlbaW5kXSAhPSAwKSB7CiAgICAgICAgICAgIHNlZ1tpbmRdICs9IChoaWdoIC0gbG93ICsgMSkgKiBsYXp5W2luZF0gOwoKICAgICAgICAgICAgLy8gUHJvcG9nYXRlIHRoZSB1cGRhdGVzIGRvd24KICAgICAgICAgICAgaWYgKGxvdyAhPSBoaWdoKSB7CiAgICAgICAgICAgICAgICBsYXp5WyhpbmQgPDwgMSkgKyAxXSArPSBsYXp5W2luZF07CiAgICAgICAgICAgICAgICBsYXp5WyhpbmQgPDwgMSkgKyAyXSArPSBsYXp5W2luZF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxhenlbaW5kXSA9IDAgOwogICAgICAgIH0KCiAgICAgICAgaWYoaGlnaCA8IHJhbmdlTGVmdCB8fCBsb3cgPiByYW5nZVJpZ2h0KSB7CiAgICAgICAgICAgIHJldHVybiA7CiAgICAgICAgfQoKICAgICAgICBpZihsb3cgPj0gcmFuZ2VMZWZ0ICYmIGhpZ2ggPD0gcmFuZ2VSaWdodCkgewogICAgICAgICAgICBzZWdbaW5kXSArPSAoaGlnaCAtIGxvdyArIDEpICogaW5jIDsKCiAgICAgICAgICAgIGlmKGxvdyAhPSBoaWdoKSB7CiAgICAgICAgICAgICAgICBsYXp5WyhpbmQgPDwgMSkgKyAxXSArPSBpbmMgOwogICAgICAgICAgICAgICAgbGF6eVsoaW5kIDw8IDEpICsgMl0gKz0gaW5jIDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gOwogICAgICAgIH0KCiAgICAgICAgaW50IG1pZCA9IGxvdyArICgoaGlnaCAtIGxvdykgLyAyKSA7CiAgICAgICAgcmFuZ2VVcGRhdGUoKGluZCA8PCAxKSArIDEgLCByYW5nZUxlZnQgLCByYW5nZVJpZ2h0ICwgaW5jICwgbG93ICwgbWlkKSA7CiAgICAgICAgcmFuZ2VVcGRhdGUoKGluZCA8PCAxKSArIDIgLCByYW5nZUxlZnQgLCByYW5nZVJpZ2h0ICwgaW5jICwgbWlkICsgMSAsIGhpZ2gpIDsKICAgICAgICBzZWdbaW5kXSA9IHNlZ1soaW5kIDw8IDEpICsgMV0gKyBzZWdbKGluZCA8PCAxKSArIDJdIDsKICAgIH0KCiAgICB2b2lkIHJhbmdlVXBkYXRlKGludCByYW5nZUxlZnQgLCBpbnQgcmFuZ2VSaWdodCAsIGludCBpbmMpIHsKICAgICAgICByYW5nZVVwZGF0ZSgwICwgcmFuZ2VMZWZ0ICwgcmFuZ2VSaWdodCAsIGluYyAsIDAgLCBuIC0gMSkgOwogICAgfQp9OwoKdm9pZCBzb2x2ZSgpIHsKICAgIGludCBuIDsgY2luID4+IG4gOwogICAgdmVjdG9yPGludD4gYXJyKG4pIDsKICAgIGZvcihpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKykgewogICAgICAgIGNpbiA+PiBhcnJbaV0gOwogICAgfQogICAgU2VnbWVudFRyZWUgc3QobikgOwogICAgc3QuYnVpbGQoMCAsIDAgLCBuIC0gMSAsIGFycikgOwoKICAgIGludCBxIDsgY2luID4+IHEgOwogICAgZm9yKGludCBRID0gMCA7IFEgPCBxIDsgUSsrKSB7CiAgICAgICAgaW50IHR5cGUgOyBjaW4gPj4gdHlwZSA7CgogICAgICAgIC8vIFR5cGUtMTogUXVlcnkKICAgICAgICBpZih0eXBlID09IDEpIHsKICAgICAgICAgICAgaW50IGwgLCByIDsgY2luID4+IGwgPj4gciA7CiAgICAgICAgICAgIGNvdXQgPDwgc3QucXVlcnkobCAsIHIpIDw8IGVuZGwgOwogICAgICAgIH0KICAgICAgICAvLyBUeXBlLTI6IFBvaW50IFVwZGF0ZQogICAgICAgIGVsc2UgaWYodHlwZSA9PSAyKSB7CiAgICAgICAgICAgIGludCBpbmQgLCB2YWwgOyBjaW4gPj4gaW5kID4+IHZhbCA7CiAgICAgICAgICAgIHN0LnBvaW50VXBkYXRlKGluZCAsIHZhbCkgOwogICAgICAgIH0KICAgICAgICAvLyBUeXBlLTM6IFJhbmdlIFVwZGF0ZQogICAgICAgIGVsc2UgaWYodHlwZSA9PSAzKSB7CiAgICAgICAgICAgIGludCBsICwgciAsIGluYyA7IGNpbiA+PiBsID4+IHIgPj4gaW5jIDsKICAgICAgICAgICAgc3QucmFuZ2VVcGRhdGUobCAsIHIgLCBpbmMpIDsKICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKCkgewoKICAgIC8vIGZyZW9wZW4oImlucHV0LnR4dCIgLCAiciIgLCBzdGRpbikgOwogICAgLy8gZnJlb3Blbigib3V0cHV0LnR4dCIgLCAidyIgLCBzdGRvdXQpIDsKCiAgICBpbnQgdCA7IGNpbiA+PiB0IDsKICAgIHdoaWxlKHQtLSkgewogICAgICAgIHNvbHZlKCkgOwogICAgfQogICAgcmV0dXJuIDAgOwp9