The Little Elephant loves playing with arrays. He has array a, consisting of n positive integers, indexed from 1 to n. Let's denote the number with index i as ai. 

Additionally the Little Elephant has m queries to the array, each query is characterised by a pair of integers lj and rj (1 ≤ lj ≤ rj ≤ n). For each query lj, rj the Little Elephant has to count, how many numbers x exist, such that number x occurs exactly x times among numbers alj, alj + 1, ..., arj.

Help the Little Elephant to count the answers to all queries.

Input

The first line contains two space-separated integers n and m (1 ≤ n, m ≤ 105) — the size of array a and the number of queries to it. The next line contains n space-separated positive integers a1, a2, ..., an (1 ≤ ai ≤ 109). Next m lines contain descriptions of queries, one per line. The j-th of these lines contains the description of the j-th query as two space-separated integers lj and rj (1 ≤ lj ≤ rj ≤ n).

Output

In m lines print m integers — the answers to the queries. The j-th line should contain the answer to the j-th query.

Examples

Input

7 2
3 1 2 2 3 3 7
1 7
3 4


Output

3
1
/*
 * Author Ayub Subhaniya
 * Institute DA-IICT
 */

import java.io.*;
import java.math.*;
import java.util.*;


public class Codeforces408{
	
	InputStream in;
	PrintWriter out;
	
	int N=350;
	int MAXN=(int)1e6+7;
	int[] freq=new int[MAXN];
	int cnt=0;
	void add(int a)
	{
		//tr("add->"+a);
		if (freq[a]==a)
			cnt--;
		else if (freq[a]==a-1)
			cnt++;
		
		freq[a]++;
		
	}
	
	void remove(int a)
	{
		//tr("remove->"+a);
		if (freq[a]==a)
			cnt--;
		else if (freq[a]==a+1)
			cnt++;
		
		freq[a]--;
	}
	
	void solve() {
		int n=ni();
		//N=(int)Math.sqrt(n);
		int m=ni();
		int a[]=new int[n];
		
		for (int i=0;i<n;i++)
		{
			a[i]=ni();
			if (a[i]>MAXN)
				a[i]=MAXN-1;
		}
		
		Node query[]=new Node[m];
		
		for (int i=0;i<m;i++)
		{
			int l=ni();
			int r=ni();
			query[i]=new Node(l-1,r-1,i);
		}
		
		Arrays.sort(query);
		int ans[]=new int[m];
		int L=0,R=0;
		add(a[0]);
		for (int i=0;i<m;i++)
		{
			int l=query[i].u;
			int r=query[i].v;
			//tr(l+" "+r);
			while (L<l)
			{
				//tr("remove L");
				remove(a[L]);
				L++;
			}
			
			while (L>l)
			{
				//tr("add L");
				add(a[L-1]);
				L--;
			}
			
			while (R<r)
			{
				//tr("add R");
				add(a[R+1]);
				R++;
			}
			
			while (R>r)
			{
				//tr("remove R");
				remove(a[R]);
				R--;
			}
			ans[query[i].idx]=cnt;
		}
		
		for (int i=0;i<m;i++)
			out.println(ans[i]);
		
	}
	
	class Node implements Comparable<Node>
	{
		int u;
		int v;
		int idx;
		int block;
		Node (int a,int b,int c)
		{
			u=a;
			v=b;
			idx=c;
			block=u/N;
		}

		@Override
		public int compareTo(Node o) {
			if (block==o.block)
				return Integer.compare(v, o.v);
			else
				return Integer.compare(block, o.block);
		}
		
	}
	
	void run() throws Exception {
		String INPUT = "C:/Users/ayubs/Desktop/input.txt";
		//oj=true;
		in = oj ? System.in : new FileInputStream(INPUT);
		out = new PrintWriter(System.out);
		
			long s = System.currentTimeMillis();
			solve();
			out.flush();
			tr(System.currentTimeMillis() - s + "ms");
		
	}
	public static void main(String[] args) throws Exception {
		new Codeforces408().run();
	}
	
	private byte[] inbuf = new byte[1024];
	public int lenbuf = 0, ptrbuf = 0;
	
	private int readByte() {
		if (lenbuf == -1)
			throw new InputMismatchException();
		if (ptrbuf >= lenbuf) {
			ptrbuf = 0;
			try {
				lenbuf = in.read(inbuf);
			} catch (IOException e) {
				throw new InputMismatchException();
			}
			if (lenbuf <= 0)
				return -1;
		}
		return inbuf[ptrbuf++];
	}
	
	private boolean inSpaceChar(int c) {
		return !(c >= 33 && c <= 126);
	}
	
	private int skip() {
		int b;
		while ((b = readByte()) != -1 && inSpaceChar(b))
			;
		return b;
	}
	
	private double nd() {
		return Double.parseDouble(ns());
	}
	
	private char nc() {
		return (char) skip();
	}
	
	private String ns() {
		int b = skip();
		StringBuilder sb = new StringBuilder();
		while (!(inSpaceChar(b))) { // when nextLine, (inSpaceChar(b) && b != ' ')
			sb.appendCodePoint(b);
			b = readByte();
		}
		return sb.toString();
	}
	
	private char[] ns(int n) {
		char[] buf = new char[n];
		int b = skip(), p = 0;
		while (p < n && !(inSpaceChar(b))) {
			buf[p++] = (char) b;
			b = readByte();
		}
		return n == p ? buf : Arrays.copyOf(buf, p);
	}
	
	private char[][] nm(int n, int m) {
		char[][] map = new char[n][];
		for (int i = 0; i < n; i++)
			map[i] = ns(m);
		return map;
	}
	
	private int[] na(int n) {
		int[] a = new int[n];
		for (int i = 0; i < n; i++)
			a[i] = ni();
		return a;
	}
	
	private int ni() {
		int num = 0, b;
		boolean minus = false;
		while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'))
			;
		if (b == '-') {
			minus = true;
			b = readByte();
		}
		
		while (true) {
			if (b >= '0' && b <= '9') {
				num = num * 10 + (b - '0');
			} else {
				return minus ? -num : num;
			}
			b = readByte();
		}
	}
	
	private long nl() {
		long num = 0;
		int b;
		boolean minus = false;
		while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'))
			;
		if (b == '-') {
			minus = true;
			b = readByte();
		}
		
		while (true) {
			if (b >= '0' && b <= '9') {
				num = num * 10 + (b - '0');
			} else {
				return minus ? -num : num;
			}
			b = readByte();
		}
	}
	
	private boolean oj = System.getProperty("ONLINE_JUDGE") != null;
	
	private void tr(Object... o) {
		if (!oj)
			System.out.println(Arrays.deepToString(o));
	}
	
}
