#include #include #include #include using namespace std; #define E 0.0000000001 int child[2000001]; int next [2000001]; int nmin [2000001]; int nmax [2000001]; int stack_p[2000001]; int stack_n[2000001]; int dfs( ) { int n = 0; int num = 0; stack_p[0] = 0; stack_n[0] = child[0]; nmin[0] = num ++; while( n >= 0 ){ int pos = stack_p[n]; int cld = stack_n[n]; if( cld < 0 ){ nmax[pos] = num ++; n --; } else{ stack_n[n] = next[cld]; n ++; nmin[cld] = num ++; stack_p[n] = cld; stack_n[n] = child[cld]; } } return num; } int main( void ) { FILE *in = fopen( "cells.in", "r" ); int T; fscanf( in,"%d", &T ); for( int C = 0; C < T; C ++ ){ int n; fscanf( in, "%d", &n ); int J = 1; memset( child, 0xff, sizeof(child) ); memset( next, 0xff, sizeof(next) ); for( int i = 0; i < n; i ++ ){ int c; fscanf( in, "%d", &c ); if( c > 0 ){ child[i] = J; for( int j = J; j < J + c - 1; j ++ ) next[j] = j + 1; next[J+c-1] = -1; } else child[i] = -1; J += c; } for( int i = 0; i < J; i ++ ){ nmin[i] = INT_MIN; nmax[i] = INT_MAX; } dfs( ); fscanf( in, "%d", &n ); int r = 0; for( int i = 0; i < n; i ++ ){ int a, b; fscanf( in,"%d%d", &a, &b ); if( nmin[a] <= nmin[b] && nmax[b] <= nmax[a] ) r ++; } printf( "%d\n", r ); } fclose( in ); return 0; }