Problem:
Score : 500 points

Problem Statement

There is an infinitely long street that runs west to east, which we consider as a number line.

There are N roadworks scheduled on this street.
The i-th roadwork blocks the point at coordinate X_i from time S_i - 0.5 to time T_i - 0.5.

Q people are standing at coordinate 0. The i-th person will start the coordinate 0 at time D_i, continue to walk with speed 1 in the positive direction and stop walking when reaching a blocked point.

Find the distance each of the Q people will walk.

Constraints

All values in input are integers.

1 \leq N, Q \leq 2 \times 10^5

0 \leq S_i < T_i \leq 10^9

1 \leq X_i \leq 10^9

0 \leq D_1 < D_2 < ... < D_Q \leq 10^9

If i \neq j and X_i = X_j, the intervals [S_i, T_i) and [S_j, T_j) do not overlap.

Input

Input is given from Standard Input in the following format:

N Q
S_1 T_1 X_1
:
S_N T_N X_N
D_1
:
D_Q

Output

Print Q lines. The i-th line should contain the distance the i-th person will walk or -1 if that person walks forever.

Sample Input 1

4 6
1 3 2
7 13 10
18 20 13
3 4 2
0
1
2
3
5
8

Sample Output 1

2
2
10
-1
13
-1

The first person starts coordinate 0 at time 0 and stops walking at coordinate 2 when reaching a point blocked by the first roadwork at time 2.

The second person starts coordinate 0 at time 1 and reaches coordinate 2 at time 3. The first roadwork has ended, but the fourth roadwork has begun, so this person also stops walking at coordinate 2.

The fourth and sixth persons encounter no roadworks while walking, so they walk forever. The output for these cases is -1.

Solution in C# (.NET Core 3.1.201) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

public static class Ex
{
    public static bool IsNullOrEmpty(this string s) { return string.IsNullOrEmpty(s); }
    public static List<string> FastSort(this List<string> s) { s.Sort(StringComparer.OrdinalIgnoreCase); return s.ToList(); }
    public static void yesno(this bool b) { Console.WriteLine(b ? "yes" : "no"); }
    public static void YesNo(this bool b) { Console.WriteLine(b ? "Yes" : "No"); }
    public static void YESNO(this bool b) { Console.WriteLine(b ? "YES" : "NO"); }
    public static int PopCount(this int bits)
    {
        bits = (bits & 0x55555555) + (bits >> 1 & 0x55555555);
        bits = (bits & 0x33333333) + (bits >> 2 & 0x33333333);
        bits = (bits & 0x0f0f0f0f) + (bits >> 4 & 0x0f0f0f0f);
        bits = (bits & 0x00ff00ff) + (bits >> 8 & 0x00ff00ff);
        return (bits & 0x0000ffff) + (bits >> 16 & 0x0000ffff);
    }
}



partial class Program
{
    public string GetStr() { return Console.ReadLine().Trim(); }
    public char GetChar() { return Console.ReadLine().Trim()[0]; }
    public int GetInt() { return int.Parse(Console.ReadLine().Trim()); }
    public long GetLong() { return long.Parse(Console.ReadLine().Trim()); }
    public double GetDouble() { return double.Parse(Console.ReadLine().Trim()); }
    public string[] GetStrArray() { return Console.ReadLine().Trim().Split(' '); }
    public string[][] GetStrArray(int N)
    {
        var res = new string[N][];
        for (int i = 0; i < N; i++) res[i] = Console.ReadLine().Trim().Split(' ');
        return res;
    }
    public int[] GetIntArray() { return Console.ReadLine().Trim().Split(' ').Select(int.Parse).ToArray(); }
    public int[][] GetIntArray(int N)
    {
        var res = new int[N][];
        for (int i = 0; i < N; i++) res[i] = Console.ReadLine().Trim().Split(' ').Select(int.Parse).ToArray();
        return res;
    }
    public long[] GetLongArray() { return Console.ReadLine().Trim().Split(' ').Select(long.Parse).ToArray(); }
    public long[][] GetLongArray(int N)
    {
        var res = new long[N][];
        for (int i = 0; i < N; i++) res[i] = Console.ReadLine().Trim().Split(' ').Select(long.Parse).ToArray();
        return res;
    }
    public char[] GetCharArray() { return Console.ReadLine().Trim().Split(' ').Select(char.Parse).ToArray(); }
    public double[] GetDoubleArray() { return Console.ReadLine().Trim().Split(' ').Select(double.Parse).ToArray(); }
    public double[][] GetDoubleArray(int N)
    {
        var res = new double[N][];
        for (int i = 0; i < N; i++) res[i] = Console.ReadLine().Trim().Split(' ').Select(double.Parse).ToArray();
        return res;
    }
    public char[][] GetGrid(int H)
    {
        var res = new char[H][];
        for (int i = 0; i < H; i++) res[i] = Console.ReadLine().Trim().ToCharArray();
        return res;
    }
    public T[] CreateArray<T>(int N, T value)
    {
        var res = new T[N];
        for (int i = 0; i < N; i++) res[i] = value;
        return res;
    }
    public T[][] CreateArray<T>(int H, int W, T value)
    {
        var res = new T[H][];
        for (int i = 0; i < H; i++)
        {
            res[i] = new T[W];
            for (int j = 0; j < W; j++) res[i][j] = value;
        }
        return res;
    }
    public T[][][] CreateArray<T>(int H, int W, int R, T value)
    {
        var res = new T[H][][];
        for (int i = 0; i < H; i++)
        {
            res[i] = new T[W][];
            for (int j = 0; j < W; j++)
            {
                res[i][j] = new T[R];
                for (int k = 0; k < R; k++) res[i][j][k] = value;
            }
        }
        return res;
    }

    Dictionary<int, List<int>> GetUnweightedAdjacencyList(int N, int M, bool isDirected, bool isNode_0indexed)
    {
        var dic = new Dictionary<int, List<int>>();
        foreach (var e in Enumerable.Range(0, N)) { dic.Add(e, new List<int>()); }
        for (int i = 0; i < M; i++)
        {
            var input = GetIntArray();
            var a = isNode_0indexed ? input[0] : input[0] - 1;
            var b = isNode_0indexed ? input[1] : input[1] - 1;
            dic[a].Add(b);
            if (isDirected == false) dic[b].Add(a);
        }
        return dic;
    }
    Dictionary<int, List<Edge>> GetWeightedAdjacencyList(int N, int M, bool isDirected, bool isNode_0indexed)
    {
        var dic = new Dictionary<int, List<Edge>>();
        foreach (var e in Enumerable.Range(0, N)) { dic.Add(e, new List<Edge>()); }
        for (int i = 0; i < M; i++)
        {
            var input = GetIntArray();
            var a = isNode_0indexed ? input[0] : input[0] - 1;
            var b = isNode_0indexed ? input[1] : input[1] - 1;
            var c = input[2];
            dic[a].Add(new Edge(b, c));
            if (isDirected == false) dic[b].Add(new Edge(a, c));
        }
        return dic;
    }

    bool eq<T, U>() => typeof(T).Equals(typeof(U));
    T ct<T, U>(U a) => (T)Convert.ChangeType(a, typeof(T));
    T cv<T>(string s) => eq<T, int>() ? ct<T, int>(int.Parse(s))
                       : eq<T, long>() ? ct<T, long>(long.Parse(s))
                       : eq<T, double>() ? ct<T, double>(double.Parse(s))
                       : eq<T, char>() ? ct<T, char>(s[0])
                                         : ct<T, string>(s);
    void Multi<T>(out T a) => a = cv<T>(GetStr());
    void Multi<T, U>(out T a, out U b)
    {
        var ar = GetStrArray(); a = cv<T>(ar[0]); b = cv<U>(ar[1]);
    }
    void Multi<T, U, V>(out T a, out U b, out V c)
    {
        var ar = GetStrArray(); a = cv<T>(ar[0]); b = cv<U>(ar[1]); c = cv<V>(ar[2]);
    }
    void Multi<T, U, V, W>(out T a, out U b, out V c, out W d)
    {
        var ar = GetStrArray(); a = cv<T>(ar[0]); b = cv<U>(ar[1]); c = cv<V>(ar[2]); d = cv<W>(ar[3]);
    }
    void Multi<T, U, V, W, X>(out T a, out U b, out V c, out W d, out X e)
    {
        var ar = GetStrArray(); a = cv<T>(ar[0]); b = cv<U>(ar[1]); c = cv<V>(ar[2]); d = cv<W>(ar[3]); e = cv<X>(ar[4]);
    }
    void Multi<T, U, V, W, X, Y>(out T a, out U b, out V c, out W d, out X e, out Y f)
    {
        var ar = GetStrArray(); a = cv<T>(ar[0]); b = cv<U>(ar[1]); c = cv<V>(ar[2]); d = cv<W>(ar[3]); e = cv<X>(ar[4]); f = cv<Y>(ar[5]);
    }

    int[] dx = new int[] { 1, 0, -1, 0, 1, 1, -1, -1 };
    int[] dy = new int[] { 0, 1, 0, -1, 1, -1, 1, -1 };
}

class Pair : IComparable<Pair>
{
    public Pair(int node, long cost)
    {
        Node = node; Cost = cost;
    }
    public int Node { get; set; }
    public long Cost { get; set; }
    public int CompareTo(Pair p)
    {
        return p.Cost > Cost ? 1 : -1;
    }
}

class Edge
{
    public Edge(int to, long length)
    {
        To = to;
        Length = length;
    }
    public int To { get; set; }
    public long Length { get; set; }
}

class Comparable : IComparable<Comparable>
{
    public Comparable(int x, int id)
    {
        X = x;
        Id = id;
    }

    public int X;
    public int Id;
    public int CompareTo(Comparable c)
    {
        return X >= c.X ? -1 : 1;
    }
}

class Comparer<T> : IComparer<T>
{
    public int Compare(T t1, T t2)
    {
        return 1;
    }
}




partial class Program
{
    static void Main()
    {
        Console.SetOut(new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false });
        new Program().Solve();
        Console.Out.Flush();
        Console.Read();
    }

    public void Solve()
    {
        int N, Q;
        Multi(out N, out Q);
        var pq = new PriorityQueue<Comparable>();
        var set = new HashSet<int>();
        var stx = GetIntArray(N).Select((e, id) => new { id = id, s = e[0], t = e[1], x = e[2] }).ToArray();
        var L = stx.Select(e => new { dif = e.s - e.x, ele = e }).OrderBy(e => e.dif).ToArray();
        var R = stx.Select(e => new { dif = e.t - e.x, ele = e }).OrderBy(e => e.dif).ToArray();
        foreach (var item in stx) set.Add(item.id);
        var lnow = 0;
        var rnow = 0;
        for (int i = 0; i < Q; i++)
        {
            var D = GetInt();
            for (; lnow < N; lnow++)
            {
                if (D < L[lnow].dif) break;
                pq.Enqueue(new Comparable(L[lnow].ele.x, L[lnow].ele.id));
            }
            for (; rnow < N; rnow++)
            {
                if (D < R[rnow].dif) break;
                set.Remove(R[rnow].ele.id);
            }
            while (pq.Count() > 0)
            {
                if (set.Contains(pq.Peek().Id) == false) pq.Dequeue();
                else break;
            }
            Console.WriteLine(pq.Count() > 0 ? pq.Peek().X : -1);
        }
    }


    class PriorityQueue<T> where T : IComparable<T>
    {
        public PriorityQueue()
        {
            buffer = new List<T>();
        }

        List<T> buffer;
        public void Enqueue(T elem)
        {
            int n = buffer.Count;
            buffer.Add(elem);
            while (n != 0)
            {
                int i = (n - 1) / 2;
                if (buffer[n].CompareTo(buffer[i]) > 0)
                {
                    T temp = buffer[n];
                    buffer[n] = buffer[i];
                    buffer[i] = temp;
                }
                n = i;
            }
        }

        public T Dequeue()
        {
            var t = Peek();
            Pop();
            return t;
        }

        void Pop()
        {
            int n = buffer.Count - 1;
            buffer[0] = buffer[n];
            buffer.RemoveAt(n);
            for (int i = 0, j; (j = 2 * i + 1) < n;)
            {
                if ((j != n - 1) && (buffer[j].CompareTo(buffer[j + 1]) < 0)) { j++; }
                if (buffer[i].CompareTo(buffer[j]) < 0)
                {
                    T temp = buffer[j];
                    buffer[j] = buffer[i];
                    buffer[i] = temp;
                }
                i = j;
            }
        }

        public T Peek()
        {
            return buffer[0];
        }

        public int Count()
        {
            return buffer.Count;
        }
    }
}