import std.conv;
import std.range;
import std.stdio;
import std.string;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto nmq = input.front.split.to!( long[] );
	auto lrs = new long[ 2 ][ nmq[ 1 ] ];
	foreach( ref lr; lrs )
	{
		input.popFront;
		lr = input.front.split.to!( long[] );
	}
	auto pqs = new long[ 2 ][ nmq[ 2 ] ];
	foreach( ref pq; pqs )
	{
		input.popFront;
		pq = input.front.split.to!( long[] );
	}
	return tuple( nmq[ 0 ], lrs, pqs );
}

auto solve( in long n, in long[ 2 ][] lrs, in long[ 2 ][] pqs )
{
	// LとRを軸にした表に列車をプロット（0行目と0列目は全て0にすると後が楽）
	auto sss = new long[][]( n + 1, n + 1 );
	foreach( lr; lrs )
	{
		sss[ lr[ 0 ] ][ lr[ 1 ] ]++;
	}
	
	// プロット表を二次元累積和表に変換
	foreach( l; 1 .. sss.length )
	{
		foreach( r; 1 .. sss[ l ].length )
		{
			sss[ l ][ r ] += sss[ l ][ r - 1 ] + sss[ l - 1 ][ r ] - sss[ l - 1 ][ r - 1 ];		// 二重に加算しないように重複部分を引く
		}
	}
	
	// 表を使って条件に一致する列車の数を計算
	auto cs = new string[ pqs.length ];
	foreach( ref c, pq; lockstep( cs, pqs ) )
	{
		auto p = pq[ 0 ] - 1;
		auto q = pq[ 1 ];
		c = ( sss[ q ][ q ] - sss[ p ][ q ] - sss[ q ][ p ] + sss[ p ][ p ] ).to!( string );		// 二重に減算しないように重複部分を足す
	}
	
	return cs.join( "\n" );
}
