const int MX = 1e7 + 10 ;
const int XX =  50000 + 10 ;
const int open = 1 ;
const int point = 2 ;
const int close = 3 ;

struct abc
{
    int x , y , val ,  priority , lim ;
};

abc inp[MX];
Long tree[MX];
Long ans[XX];
bool cmp( abc A  , abc B )
{
    if( A.x == B.x )
    {

            return A.priority < B.priority ;

    }
    return A.x < B.x ;
}
void add( int x , int v )
{
    while( x < MX )
    {
        tree[x] += v ;
        x += ( x & -x );
    }
}
Long sum( int x )
{
    Long ans = 0 ;
    while( x )
    {
        ans += tree[x];
        x -= ( x & -x );
    }
    return ans ;
}
void solve()
{
   // I will always use scanf and printf
   // May be i won't be a good programmer but i will be a good human being
    int cs , t ;
    scanf("%d",&t);
    for ( cs = 1 ; cs <= t ; cs++ )
    {
        int n ;
        scanf("%d",&n);
        rep( i , n )
        {
            scanf("%d %d %d",&inp[i].x,&inp[i].y,&inp[i].val);
            inp[i].x++;
            inp[i].y++;
            inp[i].priority = point ;
        }
        int idx = n ;
        int r = II ;
        rep( i , r )
        {
            scanf("%d %d",&inp[i].x,&inp[i].y);
            inp[idx].x++;
            inp[idx].y++;
            inp[idx].priority = open ;
            inp[idx].val = i ;
            idx++;
            scanf("%d %d",&inp[i].x,&inp[i].y);
            inp[idx].x++;
            inp[idx].y++;
            inp[idx].priority = close ;
            inp[idx].val = i ;
            inp[idx-1].lim = inp[idx].y ;
            inp[idx].lim = inp[idx-1].y ;
            idx++;
        }
        sort ( inp , inp + idx , cmp );
        ms( tree , 0 );
        ms( ans , 0 );
        rep( i , idx )
        {
            if(inp[i].priority == point ) add( inp[i].y , inp[i].val );
            else if( inp[i].priority == open ) ans[inp[i].val] -= ( sum( inp[i].lim ) - sum( inp[i].y - 1 ) );
            else ans[inp[i].val] += ( sum(inp[i].y ) -  sum( inp[i].lim - 1 ) );
        }
        rep( i , r ) printf("%lld\n",ans[i]);
    }
  
}