unittest
{
	assert( [ "2 3 4", "100", "600", "400", "900", "1000", "150", "2000", "899", "799" ].parse.expand.solve == "350\n1400\n301\n399" );
	assert( [ "1 1 3", "1", "10000000000", "2", "9999999999", "5000000000" ].parse.expand.solve == "10000000000\n10000000000\n14999999998" );
}



import std.algorithm;
import std.conv;
import std.math;
import std.range;
import std.stdio;
import std.typecons;

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

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto abq = input.front.split.to!( long[] );
	auto ss = new long[ abq[ 0 ] ];
	foreach( ref s; ss )
	{
		input.popFront;
		s = input.front.to!( long );
	}
	auto ts = new long[ abq[ 1 ] ];
	foreach( ref t; ts )
	{
		input.popFront;
		t = input.front.to!( long );
	}
	auto xs = new long[ abq[ 2 ] ];
	foreach( ref x; xs )
	{
		input.popFront;
		x = input.front.to!( long );
	}
	
	return tuple( ss, ts, xs );
}

auto solve( long[] ss, long[] ts, long[] xs )
{
	const FAR = 10L ^^ 10 * 2;
	
	ss.sort();
	ts.sort();
	
	auto anss = new long[ xs.length ];
	foreach( x, ref ans; lockstep( xs, anss ) )
	{
		// xから東と西で一番近い神社までの距離を計算
		auto ssp = ss.partition3( x );
		auto sl = ( 0 < ssp[ 1 ].length ) ? 0L : ( 0 < ssp[ 0 ].length ) ? x - ssp[ 0 ][ $ - 1 ] : FAR;
		auto sr = ( 0 < ssp[ 1 ].length ) ? 0L : ( 0 < ssp[ 2 ].length ) ? ssp[ 2 ][ 0 ] - x     : FAR;
		
		// xから東と西で一番近い寺までの距離を計算
		auto tsp = ts.partition3( x );
		auto tl = ( 0 < tsp[ 1 ].length ) ? 0L : ( 0 < tsp[ 0 ].length ) ? x - tsp[ 0 ][ $ - 1 ] : FAR;
		auto tr = ( 0 < tsp[ 1 ].length ) ? 0L : ( 0 < tsp[ 2 ].length ) ? tsp[ 2 ][ 0 ] - x     : FAR;
		
		// 一番近い神社と寺の両方に行くときの最短距離を計算
		ans = min(
			max( sl, tl ),					// 西の神社と寺に行く（まっすぐ行って終わり）
			max( sr, tr ),					// 東の神社と寺に行く（まっすぐ行って終わり）
			sl + tr + min( sl, tr ),		// 西の神社と東の寺に行く（近いほうに行って戻る）
			sr + tl + min( sr, tl )			// 東の神社と西の寺に行く（近いほうに行って戻る）
		);
	}
	
	return anss.map!( to!string ).join( "\n" );
}
