unittest
{
	assert( [ "2 3 1", "1 1", "1 2", "2 2", "1 2" ].solve == "3" );
	assert( [ "10 3 2", "1 5", "2 8", "7 10", "1 7", "3 10" ].solve == "1\n1" );
	assert( [ "10 10 10", "1 6", "2 9", "4 5", "4 7", "4 7", "5 8", "6 6", "6 7", "7 9", "10 10", "1 8", "1 9", "1 10", "2 8", "2 9", "2 10", "3 8", "3 9", "3 10", "1 10" ].solve == "7\n9\n10\n6\n8\n9\n6\n7\n8\n10" );
}



import std.conv;
import std.format;
import std.range;
import std.stdio;

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

auto solve( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto n = 0L;
	auto m = 0L;
	auto q = 0L;
	input.front.formattedRead!"%s %s %s"( n, m, q );
	auto lrs = new long[ 2 ][ m ];
	foreach( ref lr; lrs )
	{
		input.popFront;
		lr = input.front.split.to!( long[] );
	}
	auto pqs = new long[ 2 ][ q ];
	foreach( ref pq; pqs )
	{
		input.popFront;
		pq = input.front.split.to!( long[] );
	}
	
	// 区間の二次元累積和表を作成
	auto tss = new long[][]( 1 + n + 1, 1 + n + 1 );
	foreach( lr; lrs )
	{
		tss[ lr[ 0 ] ][ lr[ 1 ] ]++;
	}
	foreach( i; 0L .. tss.length.signed - 1 )
	{
		foreach( j; 0L .. tss.length.signed - 1 )
		{
			tss[ i + 1 ][ j ] += tss[ i ][ j ];
			tss[ i ][ j + 1 ] += tss[ i ][ j ];
			tss[ i + 1 ][ j + 1 ] -= tss[ i ][ j ];
		}
	}
	
	// 二次元累積和表からクエリの答えを取得
	auto anss = new long[ pqs.length ];
	foreach( ref ans, pq; lockstep( anss, pqs ) )
	{
		ans += tss[ pq[ 1 ] ][ pq[ 1 ] ] - tss[ pq[ 1 ] ][ pq[ 0 ] - 1 ] - tss[ pq[ 0 ] - 1 ][ pq[ 1 ] ] + tss[ pq[ 0 ] - 1 ][ pq[ 0 ] - 1 ];
	}
	return anss.to!( string[] ).join( "\n" );
}
