#include #include #include using namespace std ; #define clr( a , x ) memset ( a , x , sizeof a ) const int MAXN = 1000005 ; struct Edge { int v , n ; Edge () {} Edge ( int v , int n ) : v ( v ) , n ( n ) {} } ; Edge E[MAXN] ; int H[MAXN] , cntE ; int c[MAXN] ; int pre[300005] ; int ans[300005] ; int cnt ; int n , m ; void init () { cntE = 0 ; clr ( H , -1 ) ; clr ( pre , 0 ) ; clr ( c , 0 ) ; clr ( ans , 0 ) ; } void addedge ( int u , int v ) { E[cntE] = Edge ( v , H[u] ) ; H[u] = cntE ++ ; } void add ( int x , int v ) { for ( int i = x ; i <= cnt ; i += i & -i ) c[i] += v ; } int sum ( int x , int ans = 0 ) { for ( int i = x ; i > 0 ; i -= i & -i ) ans += c[i] ; return ans ; } void solve () { int x , y ; cnt = 0 ; init () ; for ( int i = 1 ; i <= n ; ++ i ) { scanf ( "%d%d" , &x , &y ) ; addedge ( y , x << 1 ) ; cnt = max ( cnt , y ) ; } for ( int i = 1 ; i <= m ; ++ i ) { scanf ( "%d" , &x ) ; for ( int j = 1 ; j <= x ; ++ j ) { scanf ( "%d" , &y ) ; cnt = max ( cnt , y ) ; addedge ( y , i << 1 | 1 ) ; } } ++ cnt ; for ( int i = 1 ; i <= m ; ++ i ) { addedge ( cnt , i << 1 | 1 ) ; } for ( int i = 1 ; i <= cnt ; ++ i ) { for ( int j = H[i] ; ~j ; j = E[j].n ) { int x = E[j].v >> 1 , y = E[j].v & 1 ; if ( y ) { ans[x] -= sum ( i ) - sum ( pre[x] ) ; pre[x] = i ; } } for ( int j = H[i] ; ~j ; j = E[j].n ) { int x = E[j].v >> 1 , y = E[j].v & 1 ; if ( !y ) add ( x , 1 ) ; } } for ( int i = 1 ; i <= m ; ++ i ) { printf ( "%d\n" , ans[i] + n ) ; } } int main () { while ( ~scanf ( "%d%d" , &n , &m ) ) solve () ; return 0 ; }