Vladik had started reading a complicated book about algorithms containing n pages. To improve understanding of what is written, his friends advised him to read pages in some order given by permutation P = [p1, p2, ..., pn], where pi denotes the number of page that should be read i-th in turn.

Sometimes Vladik’s mom sorted some subsegment of permutation P from position l to position r inclusive, because she loves the order. For every of such sorting Vladik knows number x — what index of page in permutation he should read. He is wondered if the page, which he will read after sorting, has changed. In other words, has px changed? After every sorting Vladik return permutation to initial state, so you can assume that each sorting is independent from each other.

Input

First line contains two space-separated integers n, m (1 ≤ n, m ≤ 104) — length of permutation and number of times Vladik's mom sorted some subsegment of the book.

Second line contains n space-separated integers p1, p2, ..., pn (1 ≤ pi ≤ n) — permutation P. Note that elements in permutation are distinct.

Each of the next m lines contains three space-separated integers li, ri, xi (1 ≤ li ≤ xi ≤ ri ≤ n) — left and right borders of sorted subsegment in i-th sorting and position that is interesting to Vladik.

Output

For each mom’s sorting on it’s own line print "Yes", if page which is interesting to Vladik hasn't changed, or "No" otherwise.

Examples

Input

5 5
5 4 3 2 1
1 5 3
1 3 1
2 4 3
4 4 4
2 5 3


Output

Yes
No
Yes
Yes
No


Input

6 5
1 4 3 2 5 6
2 4 3
1 6 2
4 5 4
1 3 3
2 6 3


Output

Yes
No
Yes
No
Yes

Note

Explanation of first test case: 

  1. [1, 2, 3, 4, 5] — permutation after sorting, 3-rd element hasn’t changed, so answer is "Yes". 
  2. [3, 4, 5, 2, 1] — permutation after sorting, 1-st element has changed, so answer is "No". 
  3. [5, 2, 3, 4, 1] — permutation after sorting, 3-rd element hasn’t changed, so answer is "Yes". 
  4. [5, 4, 3, 2, 1] — permutation after sorting, 4-th element hasn’t changed, so answer is "Yes". 
  5. [5, 1, 2, 3, 4] — permutation after sorting, 3-rd element has changed, so answer is "No". 
/*
 * DA-IICT
 * Author: Jugal Kalal
 */
import java.util.*;
import java.io.*;
import java.math.*;
public class Main{
//	static long MOD=(long)Math.pow(10,9)+7;
	static final int lint=Integer.MAX_VALUE;
	static final double ldouble=Double.MAX_VALUE;
	public static void main(String args[]) {
        new Thread(null, new Runnable() {
            public void run() {
                try{
                    solve();
                    w.close();
                }
                catch(Exception e){
                    e.printStackTrace();
                }
            }
        }, "1", 1 << 26).start();
	}
	static InputReader in;
    static PrintWriter w;
    static void solve(){
        in = new InputReader(System.in);
        w = new PrintWriter(System.out);
        int n=in.nextInt();
        int m=in.nextInt();
        int arr[]=new int[n];
        for(int i=0;i<n;i++){
        	arr[i]=in.nextInt();
        }
        while(m-->0){
        	int l=in.nextInt()-1;
        	int r=in.nextInt()-1;
        	int x=in.nextInt()-1;
        	int count=0;
        	for(int i=l;i<=r;i++){
        		if(arr[i]<arr[x]){
        			count++;
        		}
        	}
        	if(count==x-l){
        		w.println("Yes");
        	}else{
        		w.println("No");
        	}
        }
    }
    static class TreeNode {
        int key;
        int height;
        int size;
        TreeNode left;
        TreeNode right;
        TreeNode parent;

        public TreeNode(final int key) {
            this.key = key;
            this.size = 1;
            this.height = 1;
            this.left = null;
            this.right = null;
        }
    }
    static int size(final TreeNode node) {
        return node == null ? 0 : node.size;
    }

    static int height(final TreeNode node) {
        return node == null ? 0 : node.height;
    }

    static TreeNode rotateLeft(final TreeNode root) {
        final TreeNode newRoot = root.right;
        final TreeNode leftSubTree = newRoot.left;

        newRoot.left = root;
        root.right = leftSubTree;

        root.height = max(height(root.left), height(root.right)) + 1;
        newRoot.height = max(height(newRoot.left), height(newRoot.right)) + 1;

        newRoot.size = size(newRoot.left) + size(newRoot.right) + 1;
        newRoot.size = size(newRoot.left) + size(newRoot.right) + 1;

        return newRoot;
    }
    static TreeNode rotateRight(final TreeNode root) {
        final TreeNode newRoot = root.left;
        final TreeNode rightSubTree = newRoot.right;

        newRoot.right = root;
        root.left = rightSubTree;

        root.height = max(height(root.left), height(root.right)) + 1;
        newRoot.height = max(height(newRoot.left), height(newRoot.right)) + 1;

        newRoot.size = size(newRoot.left) + size(newRoot.right) + 1;
        newRoot.size = size(newRoot.left) + size(newRoot.right) + 1;

        return newRoot;
    }
    static int max(final int a, final int b) {
        return a >= b ? a : b;
    }
    static  TreeNode insertIntoAVL(final TreeNode node, final int key, final int count[], final int index) {
        if (node == null) {
            return new TreeNode(key);
        }

        if (node.key > key) {
            node.left = insertIntoAVL(node.left, key, count, index);
        } else {
            node.right = insertIntoAVL(node.right, key, count, index);

            // update smaller elements count
            count[index] = count[index] + size(node.left) + 1;
        }
        // update the size and height
        node.height = max(height(node.left), height(node.right)) + 1;
        node.size = size(node.left) + size(node.right) + 1;

        // balance the tree
        final int balance = height(node.left) - height(node.right);
        // left-left
        if (balance > 1 && node.key > key) {
            return rotateRight(node);
        }
        // right-right
        if (balance < -1 && node.key > key) {
            return rotateLeft(node);
        }
        // left-right
        if (balance > 1 && node.key < key) {
            node.left = rotateLeft(node.left);
            return rotateRight(node);
        }
        // right-left
        if (balance > 1 && node.key < key) {
            node.right = rotateRight(node.right);
            return rotateLeft(node);
        }
        return node;
    }
    static int[] countSmallerOnRight(final int[] in) {
        final int[] smaller = new int[in.length];

        TreeNode root = null;
        for (int i = in.length - 1; i >= 0; i--) {
            root = insertIntoAVL(root, in[i], smaller, i);
        }

        return smaller;
    }
    static boolean visited[];
    static ArrayList<Integer> adj[]; //Adjacency Lists
    static int V;   // No. of vertices
    // Constructor
    static void Graph(int v){
        V = v;
        visited=new boolean[v];
        adj = new ArrayList[v];
        for (int i=0; i<v; ++i){
        	adj[i] = new ArrayList();
        }
    }
    // Function to add an edge into the graph
    static void addEdge(int v,int w){
		adj[v].add(w);
		adj[w].add(v);
    }
    static void bfs(int s,int n){
    	LinkedList<Integer> queue=new LinkedList<Integer>();
    	LinkedList<Integer> lev=new LinkedList<Integer>();
    	lev.add(0);
    	queue.add(s);
    	visited[s]=true;
    	while(!queue.isEmpty()){
    		int num=queue.pop();
    		int l=lev.pop();
    		for(int i=0;i<adj[num].size();i++){
    			if(!visited[adj[num].get(i)]){
    				visited[adj[num].get(i)]=true;
    				queue.add(adj[num].get(i));
    				lev.add(l+1);
    			}
    		}
    	}
    	
    }
    class Comp implements Comparator<ArrayList<Integer>>{
        @Override
        public int compare(ArrayList<Integer> arr1,ArrayList<Integer> arr2){
        	int min=Integer.min(arr1.size(), arr2.size());
            for(int i=0;i<min;i++){
            	if(arr1.get(i)>arr2.get(i)){
            		return 1;
            	}
            	if(arr1.get(i)<arr2.get(i)){
            		return -1;
            	}
            }
            if(arr1.size()>arr2.size()){
            	return 1;
            }
            if(arr1.size()<arr2.size()){
            	return -1;
            }
            return 0;
        }
    }
    static ArrayList<Integer> order;
    
    static boolean visited1[];
    static ArrayList<Integer> adj1[]; //Adjacency Lists
    static int V1;   // No. of vertices
    // Constructor
    static void Graph1(int v){
        V1 = v;
        adj1 = new ArrayList[v];
        for (int i=0; i<v; ++i){
        	adj1[i] = new ArrayList();
        }
    }
    // Function to add an edge into the graph
    static void addEdge1(int v,int w){
		adj1[v].add(w);
//		adj1[w].add(v);
    }
    static void bfs1(int s,int n){
    	LinkedList<Integer> queue=new LinkedList<Integer>();
    	queue.add(s);
    	visited1[s]=true;
    	int c=0;
    	while(!queue.isEmpty()){
    		c++;
    		int num=queue.pop();
    		for(int i=0;i<adj1[num].size();i++){
    			if(!visited1[adj1[num].get(i)]){
    				visited1[adj1[num].get(i)]=true;
    				queue.add(adj1[num].get(i));
    			}
    		}
    	}
    	if(c==1){
    		visited1[s]=false;
    	}
    }
    static long power(long base, long exponent, long modulus){
	    long result = 1L;
	    while (exponent > 0) {
	        if (exponent % 2L == 1L)
	            result = (result * base) % modulus;
	        exponent = exponent >> 1;
	        base = (base * base) % modulus;
	    }
	    return result;
	}
    static HashMap<Long,Long> primeFactors(long n){
        HashMap<Long,Long> ans=new HashMap<Long,Long>();
    	// Print the number of 2s that divide n
        while (n%2L==0L)
        {
            if(ans.containsKey(2L)){
            	ans.put(2L,ans.get(2L)+1L);
            }else{
            	ans.put(2L,1L);
            }
            n /= 2L;
        }
 
        // n must be odd at this point.  So we can
        // skip one element (Note i = i +2)
        for (long i = 3; i <= Math.sqrt(n); i+= 2L)
        {
            // While i divides n, print i and divide n
            while (n%i == 0)
            {
            	if(ans.containsKey(i)){
                	ans.put(i,ans.get(i)+1L);
                }else{
                	ans.put(i,1L);
                }
                n /= i;
            }
        }
 
        // This condition is to handle the case whien
        // n is a prime number greater than 2
        if (n > 2)
            ans.put(n,1L);
        return ans;
    }
//	static long gcd(long a,long b){
//		if(a==0){
//			return b;
//		}
//		return gcd(b%a,a);
//	}
	static boolean isPrime[];
////for marking all prime numbers greater than 1 and less than equal to N
	static void sieve(int N) {
	 isPrime=new boolean[N+1];
	 isPrime[0] = true;
	 isPrime[1] = true;
	 for(int i = 2; i * i <= N; ++i) {
	      if(isPrime[i] == false) {//Mark all the multiples of i as composite numbers
	          for(int j = i * i; j <= N ;j += i)
	              isPrime[j] = true;
	     }
	 }
	}
//  //if  str2 (pattern) is subsequence of str1 (Text) or not
//	static boolean function(String str1,String str2){
//	     str2 = str2.replace("", ".*");  //returns .*a.*n.*n.*a.
//	     return (str1.matches(str2));  // returns true
//	}
    static int Arr[];
    static long size[];
  //modified initialize function:
    static void initialize(int N){
    	Arr=new int[N];
    	size=new long[N];
        for(int i = 0;i<N;i++){
        	Arr[ i ] = i ;
        	size[ i ] = 1;
        }
    }
    static boolean find(int A,int B){
        if( root(A)==root(B) )       //if A and B have same root,means they are connected.
        return true;
        else
        return false;
    }
 // modified root function.
    static void weighted_union(int A,int B,int n){
        int root_A = root(A);
        int root_B = root(B);
        if(size[root_A] < size[root_B ]){
        	Arr[ root_A ] = Arr[root_B];
        	size[root_B] += size[root_A];
        }
        else{
        	Arr[ root_B ] = Arr[root_A];
        	size[root_A] += size[root_B];
        }
    }
    static int root (int i){
        while(Arr[ i ] != i){
            Arr[ i ] = Arr[ Arr[ i ] ] ; 
            i = Arr[ i ]; 
        }
        return i;
    }
    
 
	static boolean isPrime(long n) {
		if(n < 2L) return false;
		if(n == 2L || n == 3L) return true;
		if(n%2L == 0 || n%3L == 0) return false;	
		long sqrtN = (long)Math.sqrt(n)+1L;
		for(long i = 6L; i <= sqrtN; i += 6L) {
			if(n%(i-1) == 0 || n%(i+1) == 0) return false;
		}
		return true;
	}
//	static HashMap<Integer,Integer> level;;
//	static HashMap<Integer,Integer> parent;
	static int maxlevel=0;
	
//	static boolean T[][][];
//	static void subsetSum(int input[], int total, int count) {
//        T = new boolean[input.length + 1][total + 1][count+1];
//        for (int i = 0; i <= input.length; i++) {
//        	T[i][0][0] = true;
//        	for(int j = 1; j<=count; j++){
//        		T[i][0][j] = false;
//        	}
//        }
//        int sum[]=new int[input.length+1];
//        for(int i=1;i<=input.length;i++){
//            sum[i]=sum[i-1]+input[i-1];
//        }
//        for (int i = 1; i <= input.length; i++) {
//            for (int j = 1; j <= (int)Math.min(total,sum[i]); j++) {
//            	for (int k = 1; k <= (int)Math.min(i,count); k++){
//            		 if (j >= input[i - 1]) {//Exclude and Include
//                         T[i][j][k] = T[i - 1][j][k] || T[i - 1][j - input[i - 1]][k-1];
//                     } else {
//                         T[i][j][k] = T[i-1][j][k];
//                     }
//            	}
//            }
//        }
//    }
//	static <K,V extends Comparable<? super V>>
//	SortedSet<Map.Entry<K,V>> entriesSortedByValues(Map<K,V> map) {
//	    SortedSet<Map.Entry<K,V>> sortedEntries = new TreeSet<Map.Entry<K,V>>(
//	        new Comparator<Map.Entry<K,V>>() {
//	            @Override public int compare(Map.Entry<K,V> e1, Map.Entry<K,V> e2) {
//	                int res = e2.getValue().compareTo(e1.getValue());
//	                return res != 0 ? res : 1;
//	            }
//	        }
//	    );
//	    sortedEntries.addAll(map.entrySet());
//	    return sortedEntries;
//	}
	
 
	 
	//minimum prime factor of all the numbers less than n
    static int minPrime[];
	static void minimumPrime(int n){
		minPrime=new int[n+1];
		minPrime[1]=1;
        for (int i = 2; i * i <= n; ++i) {
            if (minPrime[i] == 0) {         //If i is prime
                for (int j = i * i; j <= n; j += i) {
                    if (minPrime[j] == 0) {
                        minPrime[j] = i;
                    }
                }
            }
        }
        for (int i = 2; i <= n; ++i) {
            if (minPrime[i] == 0) {
                minPrime[i] = i;
            }
        }
	}
	static long modInverse(long A, long M)
	{
		long x=extendedEuclid(A,M)[0];
		return (x%M+M)%M;    //x may be negative
	}
	static long[] extendedEuclid(long A, long B) {
		if(B == 0) {
			long d = A;
			long x = 1;
			long y = 0;
			return new long[]{x,y,d};
		}
		else {
			long arr[]=extendedEuclid(B, A%B);
			long temp = arr[0];
			arr[0] = arr[1];
			arr[1] = temp - (A/B)*arr[1];
			return arr;
		}
	}
 
	static class InputReader {
        private final InputStream stream;
        private final byte[] buf = new byte[8192];
        private int curChar, numChars;
        private SpaceCharFilter filter;
 
        public InputReader(InputStream stream) {
            this.stream = stream;
        }
        
        public int read() {
            if (numChars == -1) {
                throw new InputMismatchException();
            }
            if (curChar >= numChars) {
                curChar = 0;
                try {
                    numChars = stream.read(buf);
                } catch (IOException e) {
                    throw new InputMismatchException();
                }
                if (numChars <= 0) {
                    return -1;
                }
            }
            return buf[curChar++];
        }
 
        public String nextLine() {
            int c = read();
            while (isSpaceChar(c)) {
                c = read();
            }
            StringBuilder res = new StringBuilder();
            do {
                res.appendCodePoint(c);
                c = read();
            } while (!isEndOfLine(c));
            return res.toString();
        }
 
        public String readString() {
            int c = read();
            while (isSpaceChar(c)) {
                c = read();
            }
            StringBuilder res = new StringBuilder();
            do {
                res.appendCodePoint(c);
                c = read();
            } while (!isSpaceChar(c));
            return res.toString();
        }
 
        public long nextLong() {
            int c = read();
            while (isSpaceChar(c)) {
                c = read();
            }
            int sgn = 1;
            if (c == '-') {
                sgn = -1;
                c = read();
            }
            long res = 0;
            do {
                if (c < '0' || c > '9') {
                    throw new InputMismatchException();
                }
                res *= 10;
                res += c - '0';
                c = read();
            } while (!isSpaceChar(c));
            return res * sgn;
        }
 
        public int nextInt() {
            int c = read();
            while (isSpaceChar(c)) {
                c = read();
            }
            int sgn = 1;
            if (c == '-') {
                sgn = -1;
                c = read();
            }
            int res = 0;
            do {
                if (c < '0' || c > '9') {
                    throw new InputMismatchException();
                }
                res *= 10;
                res += c - '0';
                c = read();
            } while (!isSpaceChar(c));
            return res * sgn;
        }
 
        public int[] nextIntArray(int n) {
            int[] arr = new int[n];
            for (int i = 0; i < n; i++) {
                arr[i] = nextInt();
            }
            return arr;
        }
 
        public long[] nextLongArray(int n) {
            long[] arr = new long[n];
            for (int i = 0; i < n; i++) {
                arr[i] = nextLong();
            }
            return arr;
        }
 
        public boolean isSpaceChar(int c) {
            if (filter != null)
                return filter.isSpaceChar(c);
            return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
        }
 
        private boolean isEndOfLine(int c) {
            return c == '\n' || c == '\r' || c == -1;
        }
        public interface SpaceCharFilter {
            public boolean isSpaceChar(int ch);
        }
	}
}
	
class Edge{
    int u=0;
    int v=0;
    long w=0L;
}
class Node{
    int red=0;
    int black=0;
}
//class Pair {
//	int x,y,z;
//
//    Pair(int x,int y,int z){
//        this.x=x;
//        this.y=y;
//        this.z=z;
//    }
//	public int hashCode() {
//		final int prime = 31;
//		int result = 1;
//		result = prime * result + x;
//		result = prime * result + y;
//		result = prime * result + z;
//		return result;
//	}
//
//	public boolean equals(Object obj) {
//		if (this == obj)
//			return true;
//		if (obj == null)
//			return false;
//		if (getClass() != obj.getClass())
//			return false;
//		Pair other = (Pair) obj;
//		if (x != other.x)
//			return false;
//		if (y != other.y)
//			return false;
//		if (z != other.z)
//			return false;
//		return true;
//	}
//}