Tsinghua OJ:范围查询(Range)

范围查询(Range)


Descriptioin

Let S be a set of n integral points on the x-axis. For each given interval [a, b], you are asked to count the points lying inside.

Input

The first line contains two integers: n (size of S) and m (the number of queries).

The second line enumerates all the n points in S.

Each of the following m lines consists of two integers a and b and defines an query interval [a, b].

Output

The number of points in S lying inside each of the m query intervals.

Example

Input

5 2
1 3 7 9 11
4 6
7 12

Output

0
3

Restrictions

0 <= n, m <= 5 * 10^5

For each query interval [a, b], it is guaranteed that a <= b.

Points in S are distinct from each other.

Coordinates of each point as well as the query interval boundaries a and b are non-negative integers not greater than 10^7.

Time: 2 sec

Memory: 256 MB

描述

数轴上有n个点,对于任一闭区间 [a, b],试计算落在其内的点数。

输入

第一行包括两个整数:点的总数n,查询的次数m。

第二行包含n个数,为各个点的坐标。

以下m行,各包含两个整数:查询区间的左、右边界a和b。

输出

对每次查询,输出落在闭区间[a, b]内点的个数。

样例

见英文题面

限制

0 ≤ n, m ≤ 5×105

对于次查询的区间[a, b],都有a ≤ b

各点的坐标互异

各点的坐标、查询区间的边界a、b,均为不超过10^7的非负整数

时间:2 sec

内存:256 MB


解题思路:

1、用points数组标识,将有坐标位置置1(points数组初始化0)。

2、更新数组:points[i] += points[i-1]  (i>1)。这时points[i],即表示[0,i]之间的坐标数。

3、用points[b] - points[a] 即得结果。

注意:由于第2步中,可能出现的下标为小于0的情况。因此,第1步置1的时候,可以将其往后移一位。

具体代码如下:

#include <cstdio>  
#include <cstdlib>

const int SZ = 1 << 20;  //提升IO buff 
struct fastio{
	char inbuf[SZ];
	char outbuf[SZ];
	fastio(){
		setvbuf(stdin, inbuf, _IOFBF, SZ);
		setvbuf(stdout, outbuf, _IOFBF, SZ);
	}
}io;

#define N 10000001
int points[N];

int main()
{
	int n, m, i, x;
	int a, b;
	scanf("%d %d", &n, &m);

	for (i = 0; i < N; i++)
		points[i] = 0;
	
	while (n--)
	{
		scanf("%d", &x);
		points[x + 1] = 1;
	}

	for (i = 2; i <= N; ++i)
		points[i] += points[i - 1];

	while (m--)
	{
		scanf("%d %d", &a, &b);
		printf("%d\n", points[b + 1] - points[a]);
	}
	return 0;
}



评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值