/*
Warn - Don't change next line else you will get WA verdict. Online Judge is configured to give WA if next line is not present.
Author - Aryan Choudhary (@aryanc403)
const short DEBUG { 0 };
#define debug(x) if (DEBUG) cout << #x << " = " << x << '\n'
*/
#pragma warning(disable:4996)
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize ("Ofast")
#pragma GCC target ("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC optimize ("-ffloat-store")
#include<iostream>
#include<bits/stdc++.h>
#include<stdio.h>
using namespace std;
#define fo(i,n) for(i=0;i<(n);++i)
#define repA(i,j,n) for(i=(j);i<=(n);++i)
#define repD(i,j,n) for(i=(j);i>=(n);--i)
#define pb push_back
#define mp make_pair
#define X first
#define Y second
#define endl "\n"
#define PI 3.1415926535897932384626433832795
typedef long long int lli;
typedef long double mytype;
typedef pair< lli,lli> ii;
typedef vector< ii> vii;
typedef vector< lli> vi;
//const lli [3] ={ 999119999L,1000000007L,1000992299L};
//const lli [3] ={ 97L,101L,103L};
//const lli = chrono::high_resolution_clock::now().time_since_epoch().count();
clock_t time_p= clock ( ) ;
void aryanc403( )
{
time_p= clock ( ) - time_p;
cerr << "Time Taken : " << ( float ) ( time_p) / CLOCKS_PER_SEC << "\n " ;
}
class CMP
{
public :
bool operator( ) ( lli a , lli b) //For min priority_queue .
{
return ! ( a <= b ) ;
}
} ;
void add( map< ii,lli> & m, ii x,lli cnt= 1 )
{
map< ii,lli> :: iterator jt;
jt= m.find ( x) ;
if ( jt== m.end ( ) ) m.insert ( mp( x,cnt) ) ;
else jt- > Y+ = cnt;
}
void del( map< ii,lli> & m, ii x,lli cnt= 1 )
{
map< ii,lli> :: iterator jt;
jt= m.find ( x) ;
if ( jt- > Y<= cnt) m.erase ( jt) ;
else jt- > Y- = cnt;
}
bool cmp( const ii & a,const ii & b)
{
return a.X < b.X || ( a.X == b.X && a.Y < b.Y ) ;
}
const lli INF = 0xFFFFFFFFFFFFFFFL;
const lli mod = 1000000007L ;
lli T,n,i,j,k,in,cnt,l,r,x,y,val,lx,rx,ly,ry;
lli m;
// string s;
char s[ 5 ] ;
map< ii,lli> final;
map< ii,lli> a;
map< ii,lli> :: iterator it;
//priority_queue < lli , vector < lli > , CMP > pq;// min priority_queue .
void updateY( lli root,lli l,lli r,lli pos,lli val,lli x)
{
if ( l> r|| r< pos|| pos< l)
return ;
add( final,{ x,root} ,val) ;
if ( l== r)
return ;
lli m= ( l+ r) / 2 ;
updateY( 2 * root,l,m,pos,val,x) ;
updateY( 2 * root+ 1 ,m+ 1 ,r,pos,val,x) ;
}
void updateX( lli root,lli l,lli r,lli x,lli y,lli val)
{
if ( l> r|| r< x|| x< l)
return ;
updateY( 1 ,1 ,n,y,val,root) ;
if ( l== r)
return ;
lli m= ( l+ r) / 2 ;
updateX( 2 * root,l,m,x,y,val) ;
updateX( 2 * root+ 1 ,m+ 1 ,r,x,y,val) ;
}
void update( lli x,lli y,lli val)
{
updateX( 1 ,1 ,n,x,y,val) ;
}
lli queryY( lli x,lli root,lli l,lli r,lli L,lli R)
{
if ( l> r|| r< L|| R< l)
return 0 ;
if ( L<= l&& r<= R)
{
it= final.find ( { x,root} ) ;
if ( it== final.end ( ) )
return 0 ;
return it- > Y;
}
lli m= ( l+ r) / 2 ;
return queryY( x,2 * root,l,m,L,R) + queryY( x,2 * root+ 1 ,m+ 1 ,r,L,R) ;
}
lli queryX( lli root,lli l,lli r,lli L,lli R,lli yl,lli yr)
{
if ( l> r|| r< L|| R< l)
return 0 ;
if ( L<= l&& r<= R)
{
return queryY( root,1 ,1 ,n,yl,yr) ;
}
lli m= ( l+ r) / 2 ;
return queryX( 2 * root,l,m,L,R,yl,yr) + queryX( 2 * root+ 1 ,m+ 1 ,r,L,R,yl,yr) ;
}
lli query( lli lx,lli ly,lli rx,lli ry)
{
return queryX( 1 ,1 ,n,lx,ly,rx,ry) ;
}
int main( void ) {
ios_base:: sync_with_stdio ( false ) ; cin .tie ( NULL ) ; cout .tie ( NULL ) ;
// freopen("txt.in", "r", stdin);
// freopen("txt.out", "w", stdout);
// cout<<std::fixed<<std::setprecision(35);
scanf ( " %lld" ,& T) ; // cin>>T;
while ( T-- )
{
// cin>>n;
final.clear ( ) ;
a.clear ( ) ;
scanf ( " %lld" ,& n) ;
// cin>>s;
scanf ( " %s" ,s) ;
while ( s[ 2 ] ! = 'D' )
{
if ( s[ 2 ] == 'T' )
{
// cin>>x>>y>>val;
scanf ( " %lld %lld %lld" ,& x,& y,& val) ;
x++ ; y++ ;
it= a.find ( { x,y} ) ;
if ( it== a.end ( ) )
{
a.insert ( mp( mp( x,y) ,val) ) ;
update( x,y,val) ;
}
else
{
update( x,y,val- it- > Y) ;
it- > Y= val;
}
}
else if ( s[ 2 ] == 'M' )
{
// cin>>lx>>ly>>rx>>ry;
scanf ( " %lld %lld %lld %lld" ,& lx,& ly,& rx,& ry) ;
lx++ ; ly++ ; rx++ ; ry++ ;
cout << query( lx,rx,ly,ry) << endl;
}
// cin>>s;
scanf ( " %s" ,s) ;
}
} aryanc403( ) ;
return 0 ;
}
LyoKICBXYXJuIC0gRG9uJ3QgY2hhbmdlIG5leHQgbGluZSBlbHNlIHlvdSB3aWxsIGdldCBXQSB2ZXJkaWN0LiBPbmxpbmUgSnVkZ2UgaXMgY29uZmlndXJlZCB0byBnaXZlIFdBIGlmIG5leHQgbGluZSBpcyBub3QgcHJlc2VudC4KICBBdXRob3IgLSBBcnlhbiBDaG91ZGhhcnkgKEBhcnlhbmM0MDMpCiAKICBjb25zdCBzaG9ydCBERUJVRyB7IDAgfTsKICAjZGVmaW5lIGRlYnVnKHgpIGlmIChERUJVRykgY291dCA8PCAjeCA8PCAiID0gIiA8PCB4IDw8ICdcbicKKi8KCiNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ5OTYpCiNwcmFnbWEgY29tbWVudChsaW5rZXIsICIvc3RhY2s6MjAwMDAwMDAwIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNwcmFnbWEgR0NDIHRhcmdldCAoInNzZSxzc2UyLHNzZTMsc3NzZTMsc3NlNCxwb3BjbnQsYWJtLG1teCxhdngsdHVuZT1uYXRpdmUiKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSAoIi1mZmxvYXQtc3RvcmUiKQoKI2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlPHN0ZGlvLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgZm8oaSxuKSAgIGZvcihpPTA7aTwobik7KytpKQojZGVmaW5lIHJlcEEoaSxqLG4pICAgZm9yKGk9KGopO2k8PShuKTsrK2kpCiNkZWZpbmUgcmVwRChpLGosbikgICBmb3IoaT0oaik7aT49KG4pOy0taSkKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBtcCBtYWtlX3BhaXIKI2RlZmluZSBYIGZpcnN0CiNkZWZpbmUgWSBzZWNvbmQKI2RlZmluZSBlbmRsICJcbiIKI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUKdHlwZWRlZiBsb25nIGxvbmcgaW50IGxsaTsKdHlwZWRlZiBsb25nIGRvdWJsZSBteXR5cGU7CnR5cGVkZWYgcGFpcjxsbGksbGxpPiBpaTsKdHlwZWRlZiB2ZWN0b3I8aWk+IHZpaTsKdHlwZWRlZiB2ZWN0b3I8bGxpPiB2aTsKCi8vY29uc3QgbGxpIFszXSA9eyA5OTkxMTk5OTlMLDEwMDAwMDAwMDdMLDEwMDA5OTIyOTlMfTsKLy9jb25zdCBsbGkgWzNdID17IDk3TCwxMDFMLDEwM0x9OwovL2NvbnN0IGxsaSAgPSBjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCk7CmNsb2NrX3QgdGltZV9wPWNsb2NrKCk7CnZvaWQgYXJ5YW5jNDAzKCkKewogICAgdGltZV9wPWNsb2NrKCktdGltZV9wOwogICAgY2Vycjw8IlRpbWUgVGFrZW4gOiAiPDwoZmxvYXQpKHRpbWVfcCkvQ0xPQ0tTX1BFUl9TRUM8PCJcbiI7Cn0KCmNsYXNzIENNUAp7CnB1YmxpYzoKICAgIGJvb2wgb3BlcmF0b3IoKShsbGkgYSAsIGxsaSBiKSAvL0ZvciBtaW4gcHJpb3JpdHlfcXVldWUgLgogICAgewogICAgICAgIHJldHVybiAhICggYSA8PSBiICk7CiAgICB9Cn07Cgp2b2lkIGFkZCggbWFwPGlpLGxsaT4gJm0sIGlpIHgsbGxpIGNudD0xKQp7CiAgICBtYXA8aWksbGxpPiA6Oml0ZXJhdG9yIGp0OwogICAganQ9bS5maW5kKHgpOwogICAgaWYoanQ9PW0uZW5kKCkpICAgICAgICAgbS5pbnNlcnQobXAoeCxjbnQpKTsKICAgIGVsc2UgICAgICAgICAgICAgICAgICAgIGp0LT5ZKz1jbnQ7Cn0KCnZvaWQgZGVsKCBtYXA8aWksbGxpPiAmbSwgaWkgeCxsbGkgY250PTEpCnsKICAgIG1hcDxpaSxsbGk+IDo6aXRlcmF0b3IganQ7CiAgICBqdD1tLmZpbmQoeCk7CiAgICBpZihqdC0+WTw9Y250KSAgICAgICAgICAgIG0uZXJhc2UoanQpOwogICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICBqdC0+WS09Y250Owp9Cgpib29sIGNtcChjb25zdCBpaSAmYSxjb25zdCBpaSAmYikKewogICAgcmV0dXJuIGEuWDxiLlh8fChhLlg9PWIuWCYmYS5ZPGIuWSk7Cn0KY29uc3QgbGxpIElORiA9IDB4RkZGRkZGRkZGRkZGRkZGTDsKY29uc3QgbGxpIG1vZCA9IDEwMDAwMDAwMDdMOwoKICAgIGxsaSBULG4saSxqLGssaW4sY250LGwscix4LHksdmFsLGx4LHJ4LGx5LHJ5OwogICAgbGxpIG07CiAgICAvLyBzdHJpbmcgczsKICAgIGNoYXIgc1s1XTsKICAgIG1hcDxpaSxsbGk+IGZpbmFsOwogICAgbWFwPGlpLGxsaT4gYTsKICAgIG1hcDxpaSxsbGk+IDo6IGl0ZXJhdG9yIGl0OwogICAgLy9wcmlvcml0eV9xdWV1ZSA8IGxsaSAsIHZlY3RvciA8IGxsaSA+ICwgQ01QID4gcHE7Ly8gbWluIHByaW9yaXR5X3F1ZXVlIC4KCnZvaWQgdXBkYXRlWShsbGkgcm9vdCxsbGkgbCxsbGkgcixsbGkgcG9zLGxsaSB2YWwsbGxpIHgpCnsKICAgIGlmKGw+cnx8cjxwb3N8fHBvczxsKQogICAgICAgIHJldHVybjsKICAgIGFkZChmaW5hbCx7eCxyb290fSx2YWwpOwogICAgaWYobD09cikKICAgICAgICByZXR1cm47CiAgICBsbGkgbT0obCtyKS8yOwogICAgdXBkYXRlWSgyKnJvb3QsbCxtLHBvcyx2YWwseCk7CiAgICB1cGRhdGVZKDIqcm9vdCsxLG0rMSxyLHBvcyx2YWwseCk7Cn0KCnZvaWQgdXBkYXRlWChsbGkgcm9vdCxsbGkgbCxsbGkgcixsbGkgeCxsbGkgeSxsbGkgdmFsKQp7CiAgICBpZihsPnJ8fHI8eHx8eDxsKQogICAgICAgIHJldHVybjsKICAgIHVwZGF0ZVkoMSwxLG4seSx2YWwscm9vdCk7CiAgICBpZihsPT1yKQogICAgICAgIHJldHVybjsKICAgIGxsaSBtPShsK3IpLzI7CiAgICB1cGRhdGVYKDIqcm9vdCxsLG0seCx5LHZhbCk7CiAgICB1cGRhdGVYKDIqcm9vdCsxLG0rMSxyLHgseSx2YWwpOwp9Cgp2b2lkIHVwZGF0ZShsbGkgeCxsbGkgeSxsbGkgdmFsKQp7CiAgICB1cGRhdGVYKDEsMSxuLHgseSx2YWwpOwp9CgpsbGkgcXVlcnlZKGxsaSB4LGxsaSByb290LGxsaSBsLGxsaSByLGxsaSBMLGxsaSBSKQp7CiAgICBpZihsPnJ8fHI8THx8UjxsKQogICAgICAgIHJldHVybiAwOwogICAgaWYoTDw9bCYmcjw9UikKICAgIHsKICAgICAgICBpdD1maW5hbC5maW5kKHt4LHJvb3R9KTsKICAgICAgICBpZihpdD09ZmluYWwuZW5kKCkpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIHJldHVybiBpdC0+WTsKICAgIH0KICAgIGxsaSBtPShsK3IpLzI7CiAgICByZXR1cm4gcXVlcnlZKHgsMipyb290LGwsbSxMLFIpK3F1ZXJ5WSh4LDIqcm9vdCsxLG0rMSxyLEwsUik7Cn0KCmxsaSBxdWVyeVgobGxpIHJvb3QsbGxpIGwsbGxpIHIsbGxpIEwsbGxpIFIsbGxpIHlsLGxsaSB5cikKewogICAgaWYobD5yfHxyPEx8fFI8bCkKICAgICAgICByZXR1cm4gMDsKICAgIGlmKEw8PWwmJnI8PVIpCiAgICB7CiAgICAgICAgcmV0dXJuIHF1ZXJ5WShyb290LDEsMSxuLHlsLHlyKTsKICAgIH0KICAgIGxsaSBtPShsK3IpLzI7CiAgICByZXR1cm4gcXVlcnlYKDIqcm9vdCxsLG0sTCxSLHlsLHlyKStxdWVyeVgoMipyb290KzEsbSsxLHIsTCxSLHlsLHlyKTsKfQoKbGxpIHF1ZXJ5KGxsaSBseCxsbGkgbHksbGxpIHJ4LGxsaSByeSkKewogICAgcmV0dXJuIHF1ZXJ5WCgxLDEsbixseCxseSxyeCxyeSk7Cn0KCmludCBtYWluKHZvaWQpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpO2Npbi50aWUoTlVMTCk7Y291dC50aWUoTlVMTCk7CiAgICAvLyBmcmVvcGVuKCJ0eHQuaW4iLCAiciIsIHN0ZGluKTsKICAgIC8vIGZyZW9wZW4oInR4dC5vdXQiLCAidyIsIHN0ZG91dCk7Ci8vIGNvdXQ8PHN0ZDo6Zml4ZWQ8PHN0ZDo6c2V0cHJlY2lzaW9uKDM1KTsKc2NhbmYoIiAlbGxkIiwmVCk7Ly8gY2luPj5UOwp3aGlsZShULS0pCnsKICAgIC8vIGNpbj4+bjsKICAgIGZpbmFsLmNsZWFyKCk7CiAgICBhLmNsZWFyKCk7CiAgICBzY2FuZigiICVsbGQiLCZuKTsKICAgIC8vIGNpbj4+czsKICAgIHNjYW5mKCIgJXMiLHMpOwogICAgd2hpbGUoc1syXSE9J0QnKQogICAgewogICAgICAgIGlmKHNbMl09PSdUJykKICAgICAgICB7CiAgICAgICAgICAgIC8vIGNpbj4+eD4+eT4+dmFsOwogICAgICAgICAgICBzY2FuZigiICVsbGQgJWxsZCAlbGxkIiwmeCwmeSwmdmFsKTsKICAgICAgICAgICAgeCsrO3krKzsKICAgICAgICAgICAgaXQ9YS5maW5kKHt4LHl9KTsKICAgICAgICAgICAgaWYoaXQ9PWEuZW5kKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGEuaW5zZXJ0KG1wKG1wKHgseSksdmFsKSk7CiAgICAgICAgICAgICAgICB1cGRhdGUoeCx5LHZhbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB1cGRhdGUoeCx5LHZhbC1pdC0+WSk7CiAgICAgICAgICAgICAgICBpdC0+WT12YWw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZihzWzJdPT0nTScpCiAgICAgICAgewogICAgICAgICAgICAvLyBjaW4+Pmx4Pj5seT4+cng+PnJ5OwogICAgICAgICAgICBzY2FuZigiICVsbGQgJWxsZCAlbGxkICVsbGQiLCZseCwmbHksJnJ4LCZyeSk7CiAgICAgICAgICAgIGx4Kys7bHkrKztyeCsrO3J5Kys7CiAgICAgICAgICAgIGNvdXQ8PHF1ZXJ5KGx4LHJ4LGx5LHJ5KTw8ZW5kbDsKICAgICAgICB9CiAgICAgICAgLy8gY2luPj5zOwogICAgICAgIHNjYW5mKCIgJXMiLHMpOwogICAgfQp9ICAgYXJ5YW5jNDAzKCk7CiAgICByZXR1cm4gMDsKfQ==