Description
在遥远的火星上,上面的植物非常奇怪,都是长方形的,每个植物用三个数来描述:左边界L、右边界R以及高度H,如下图所示描述一个植物:L=2,R=5和H=4。
每天都有一个新植物长出来,第一天的植物高度为1,后面每天长出的植物比前一天的高1。
当一个新植物长出来的时候,跟其他植物的水平线段相交处会长出一朵小花(前提是之前没有长出花朵),如果线段交于端点,是不会长花的。
下图为样例1的示意图:
给出每天的植物的坐标,计算每天长出多少新花。
Input
第一行包含一个整数N(1<=N<=100000),表示天数。
接下来N行,每行两个整数L和R(1<=L<=R<=100000),表示植物的左右边界。
Output
输出每天长出新植物后增加新花的数量。
Sample Input
输入1:
4
1 4
3 7
1 6
2 6
输入2:
5
1 3
3 5
3 9
2 4
3 8
Sample Output
输出1:
0
1
1
2
输出2:
0
0
0
3
2
Data Constraint
正解
这题很显然是树状数组(当然也可以用线段树),它要求的就是单点查询和区间修改。虽然线段树好理解好打,但如果比复杂度的话,我建议你写树状数组。
CODE(树状数组)
const
max=100100;
var
a:array[0..100000]of longint;
f:array[0..900000]of longint;
n,i,l,r:longint;
function lowbit(k:longint):longint;
begin
exit(k and -k);
end;
procedure get(k,x:longint);
begin
while k<max do begin
f[k]:=f[k]+x;
k:=k+lowbit(k);
end;
end;
function ans(k:longint):longint;
begin
ans:=0;
while k>0 do begin
ans:=ans+f[k];
k:=k-lowbit(k);
end;
end;
begin
readln(n);
for i:=1 to n do begin
readln(l,r);
writeln(ans(l)+ans(r)-a[l]-a[r]);
a[l]:=ans(l);
a[r]:=ans(r);
get(l+1,1);
get(r,-1);
end;
end.