Maybe a more pure LINQ implementation to get away from the for loops and move to iterations?
Avoid the Dictionary<string, int> boxing and keep the LINQ array as a collection of anonymous objects.
Also, use SingeOrDefault and check if the value is null. You can combine this in your message string operation and (hopefully) put that all on the same cycle.
Let me know if this improves the efficiency at all:
class Solution
{
static void Main(String[] args)
{
int n = int.Parse(Console.ReadLine());
int[] Range = Enumerable.Range(0, n).ToArray();
var list = Range.Select(e =>
{
string[] array = Console.ReadLine().Split(null);
return new { key = array[0], val = int.Parse(array[1]) };
});
foreach (var r in Range)
{
var found = list.SingleOrDefault(l => l.key == Console.ReadLine());
string msg = found == null ? "Not Found" : $"{found.key}={found.val}";
Console.WriteLine(msg);
}
}
}