#include <fstream>
#include <complex>
#include <algorithm>
#include <vector>
#include <assert.h>
#include <utility>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
using namespace std;
int height[ 1 << 18 ] ;
int minValue[ 1 << 18 ] ;
int maxValue[ 1 << 18 ] ;
int dx;
void Push( int pos)
{
if ( pos >= dx)
return ;
if ( height[ pos] ! = 0 )
{
height[ pos * 2 ] = max( height[ pos] , height[ pos * 2 ] ) ;
height[ pos * 2 + 1 ] = max( height[ pos] , height[ pos * 2 + 1 ] ) ;
minValue[ pos * 2 ] = max( minValue[ pos * 2 ] , height[ pos] ) ;
maxValue[ pos * 2 ] = max( maxValue[ pos * 2 ] , height[ pos] ) ;
minValue[ pos * 2 + 1 ] = max( minValue[ pos * 2 + 1 ] , height[ pos] ) ;
maxValue[ pos * 2 + 1 ] = max( maxValue[ pos * 2 + 1 ] , height[ pos] ) ;
height[ pos] = 0 ;
}
}
void SetSegment( int l, int r, int h, int pos, int tl, int tr)
{
Push( pos) ;
if ( l == tl && r == tr)
{
height[ pos] = h;
minValue[ pos] = max( h, minValue[ pos] ) ;
maxValue[ pos] = max( h, maxValue[ pos] ) ;
return ;
}
int m = ( tl + tr) / 2 ;
if ( r <= m)
SetSegment ( l, r, h, pos * 2 , tl, m) ;
else if ( l >= m)
SetSegment ( l, r, h, pos * 2 + 1 , m, tr) ;
else
{
SetSegment ( l, m, h, pos * 2 , tl, m) ;
SetSegment ( m, r, h, pos * 2 + 1 , m, tr) ;
}
minValue[ pos] = min( minValue[ pos * 2 + 1 ] , minValue[ pos * 2 ] ) ;
maxValue[ pos] = max( maxValue[ pos * 2 + 1 ] , maxValue[ pos * 2 ] ) ;
}
int GetSegment( int l, int r, int h, int pos, int tl, int tr)
{
Push( pos) ;
if ( l == tl && r == tr)
{
if ( minValue[ pos] > h)
return 0 ;
if ( maxValue[ pos] <= h)
return r - l;
}
int m = ( tl + tr) / 2 ;
if ( r <= m)
return GetSegment ( l, r, h, pos * 2 , tl, m) ;
if ( l >= m)
return GetSegment ( l, r, h, pos * 2 + 1 , m, tr) ;
return GetSegment ( l, m, h, pos * 2 , tl, m) + GetSegment ( m, r, h, pos * 2 + 1 , m, tr) ;
}
int main( )
{
#ifndef ONLINE_JUDGE
freopen ( "Test.in" , "r" , stdin ) ;
#endif
int T;
scanf ( "%d" , & T) ;
while ( T-- )
{
int N;
scanf ( "%d" , & N) ;
dx = 1 << 17 ;
memset ( height, 0 , sizeof ( height) ) ;
memset ( minValue, 0 , sizeof ( minValue) ) ;
memset ( maxValue, 0 , sizeof ( maxValue) ) ;
int ans = 0 ;
for ( int i = 0 ; i < N; i++ )
{
int l, r, h;
scanf ( "%d %d %d" , & l, & r, & h) ;
int res = GetSegment( l, r, h, 1 , 0 , dx) ;
SetSegment( l, r, h, 1 , 0 , dx) ;
ans + = res;
}
printf ( "%d\n " , ans) ;
}
return 0 ;
}
I2luY2x1ZGUgPGZzdHJlYW0+CiNpbmNsdWRlIDxjb21wbGV4PgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDx1dGlsaXR5PgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxxdWV1ZT4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1lbW9yeS5oPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBoZWlnaHRbMSA8PCAxOF07CmludCBtaW5WYWx1ZVsxIDw8IDE4XTsKaW50IG1heFZhbHVlWzEgPDwgMThdOwppbnQgZHg7Cgp2b2lkIFB1c2goaW50IHBvcykKewoJaWYgKHBvcyA+PSBkeCkKCQlyZXR1cm47CgoJaWYgKGhlaWdodFtwb3NdICE9IDApCgl7CgkJaGVpZ2h0W3BvcyAqIDJdID0gbWF4KGhlaWdodFtwb3NdLCBoZWlnaHRbcG9zICogMl0pOwoJCWhlaWdodFtwb3MgKiAyICsgMV0gPSBtYXgoaGVpZ2h0W3Bvc10sIGhlaWdodFtwb3MgKiAyICsgMV0pOwoKCQltaW5WYWx1ZVtwb3MgKiAyXSA9IG1heChtaW5WYWx1ZVtwb3MgKiAyXSwgaGVpZ2h0W3Bvc10pOwoJCW1heFZhbHVlW3BvcyAqIDJdID0gbWF4KG1heFZhbHVlW3BvcyAqIDJdLCAgaGVpZ2h0W3Bvc10pOwoKCQltaW5WYWx1ZVtwb3MgKiAyICsgMV0gPSAgbWF4KG1pblZhbHVlW3BvcyAqIDIgKyAxXSwgaGVpZ2h0W3Bvc10pOwoJCW1heFZhbHVlW3BvcyAqIDIgKyAxXSA9ICBtYXgobWF4VmFsdWVbcG9zICogMiArIDFdLCBoZWlnaHRbcG9zXSk7CgoJCWhlaWdodFtwb3NdID0gMDsKCX0KfQp2b2lkIFNldFNlZ21lbnQoaW50IGwsIGludCByLCBpbnQgaCwgaW50IHBvcywgaW50IHRsLCBpbnQgdHIpCnsKCVB1c2gocG9zKTsKCWlmIChsID09IHRsICYmIHIgPT0gdHIpCgl7CgkJaGVpZ2h0W3Bvc10gPSBoOwoJCW1pblZhbHVlW3Bvc10gPSBtYXgoaCwgbWluVmFsdWVbcG9zXSk7CgkJbWF4VmFsdWVbcG9zXSA9IG1heChoLCBtYXhWYWx1ZVtwb3NdKTsKCQlyZXR1cm47Cgl9CgoJaW50IG0gPSAodGwgKyB0cikgLyAyOwoKCWlmIChyIDw9IG0pCgkJU2V0U2VnbWVudCAobCwgciwgaCwgcG9zICogMiwgdGwsIG0pOwoJZWxzZSBpZiAobCA+PSBtKQoJCVNldFNlZ21lbnQgKGwsIHIsIGgsIHBvcyAqIDIgKyAxLCBtLCB0cik7CgllbHNlCgl7CgkJU2V0U2VnbWVudCAobCwgbSwgaCwgcG9zICogMiwgdGwsIG0pOwoJCVNldFNlZ21lbnQgKG0sIHIsIGgsIHBvcyAqIDIgKyAxLCBtLCB0cik7Cgl9CgoJbWluVmFsdWVbcG9zXSA9IG1pbihtaW5WYWx1ZVtwb3MgKiAyICsgMV0sIG1pblZhbHVlW3BvcyAqIDJdKTsKCW1heFZhbHVlW3Bvc10gPSBtYXgobWF4VmFsdWVbcG9zICogMiArIDFdLCBtYXhWYWx1ZVtwb3MgKiAyXSk7Cn0KCmludCBHZXRTZWdtZW50KGludCBsLCBpbnQgciwgaW50IGgsIGludCBwb3MsIGludCB0bCwgaW50IHRyKQp7CQoJUHVzaChwb3MpOwoKCWlmIChsID09IHRsICYmIHIgPT0gdHIpCgl7CgkJaWYgKG1pblZhbHVlW3Bvc10gPiBoKQoJCQlyZXR1cm4gMDsKCQlpZiAobWF4VmFsdWVbcG9zXSA8PSBoKQkJCgkJCXJldHVybiByIC0gbDsKCX0KCWludCBtID0gKHRsICsgdHIpIC8gMjsKCglpZiAociA8PSBtKQoJCXJldHVybiBHZXRTZWdtZW50IChsLCByLCBoLCBwb3MgKiAyLCB0bCwgbSk7CglpZiAobCA+PSBtKQoJCXJldHVybiBHZXRTZWdtZW50IChsLCByLCBoLCBwb3MgKiAyICsgMSwgbSwgdHIpOwoJCglyZXR1cm4gR2V0U2VnbWVudCAobCwgbSwgaCwgcG9zICogMiwgdGwsIG0pICsgR2V0U2VnbWVudCAobSwgciwgaCwgcG9zICogMiArIDEsIG0sIHRyKTsKfQoKaW50IG1haW4oKQp7CiNpZm5kZWYgT05MSU5FX0pVREdFCglmcmVvcGVuKCJUZXN0LmluIiwgInIiLCBzdGRpbik7CiNlbmRpZgoJaW50IFQ7CglzY2FuZigiJWQiLCAmVCk7CgoJd2hpbGUgKFQtLSkKCXsKCQlpbnQgTjsKCQlzY2FuZigiJWQiLCAmTik7CgoJCWR4ID0gMSA8PCAxNzsKCQltZW1zZXQoaGVpZ2h0LCAwLCBzaXplb2YoaGVpZ2h0KSk7CgkJCgkJbWVtc2V0KG1pblZhbHVlLCAwLCBzaXplb2YobWluVmFsdWUpKTsKCQltZW1zZXQobWF4VmFsdWUsIDAsIHNpemVvZihtYXhWYWx1ZSkpOwoKCQlpbnQgYW5zID0gMDsKCgkJZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspCgkJewoJCQlpbnQgbCwgciwgaDsKCQkJc2NhbmYoIiVkICVkICVkIiwgJmwsICZyLCAmaCk7CgoJCQlpbnQgcmVzID0gR2V0U2VnbWVudChsLCByLCBoLCAxLCAwLCBkeCk7CgoJCQlTZXRTZWdtZW50KGwsIHIsIGgsIDEsIDAsIGR4KTsKCgkJCWFucyArPSByZXM7CgkJfQoKCQlwcmludGYoIiVkXG4iLCBhbnMpOwoKCX0KCQkKCXJldHVybiAwOwp9Cg==