N, M, X = gets.split(" ").map{|s| s.to_i} A = Array.new(M) {Array.new} N.times { a, b = gets.split(" ").map{|s| s.to_i} A[b-1] << a } A.each {|a| a.sort_by!{|x| -x} } k = gets.to_i c = gets.split(" ").map{|s| s.to_i} cnt = [] cpos = Array.new(M, 0) same = [] diff = [] 0.upto(M-1) {|j| diff << [A[j][0], j] if A[j].length > 0 } diff.sort!.reverse! c.max.times { sa, sb = same.length > 0 ? same[0] : [-Float::INFINITY, -1] da, db = diff.length > 0 ? diff[0] : [-Float::INFINITY, -1] if sa > da + X then same.shift cpos[sb] += 1 if cpos[sb] < A[sb].length then same << [A[sb][cpos[sb]], sb] same.sort!.reverse! end cnt << sa else diff.shift cpos[db] += 1 if cpos[db] < A[db].length same << [A[db][cpos[db]], db] same.sort!.reverse! end cnt << da + X end } total = 0 c.each {|i| total += cnt[0,i].sum } puts total