You are nobody.Nobody is perfect. Raymond

Raymond._.Chen

【CodeVS1080】线段树练习

Description

一行N个方格,开始每个格子里都有一个整数。现在动态地提出一些问题和修改:提问的形式是求某一个特定的子区间[a,b]中所有元素的和;修改的规则是指定某一个格子x,加上或者减去一个特定的值A。现在要求你能对每个提问作出正确的回答。1N<100000,提问和修改的总数m<10000条。

Input

输入文件第一行为个整数N,接下来是nn个整数,表示格子中原来的整数。接下一个正整数m,再接下来有m行,表示m个询问,第一个整数表示询问代号,询问代号1表示增加,后面的两个数xA表示给位置X上的数值增加A,询问代号2表示区间求和,后面两个整数表示ab,表示要求[a,b]之间的区间和。

Output

共m行,每个整数

Sample Input

6

3

4

1 3 5

2 1 4

1 1 9

2 2 6

Sample Output

22

22

Hint

1≤N≤100000, m≤10000 。

Solution

我写了树状数组,练手的= = ,当模板罢.

 1 var
 2   f:array [1..1000000] of longint;
 3   n,m,i,p,x,l,r,a:longint;
 4 
 5 function lowbit(x:longint):longint;
 6 begin
 7   lowbit:=x and (-x);
 8 end;
 9 
10 procedure plus(x,a:longint);
11 begin
12   if x>n then exit;
13   f[x]:=f[x]+a;
14   plus(x+lowbit(x),a);
15 end;
16 
17 function query(x:longint):longint;
18 begin
19   query:=0;
20   if x<=0 then exit;
21   query:=f[x];
22   query:=query+query(x-lowbit(x));
23 end;
24 
25 begin
26   read(n);
27   for i:=1 to n do
28     begin
29       read(a);
30       plus(i,a);
31      end;
32   read(m);
33   for i:=1 to m do
34     begin
35       read(x);
36       if x=1
37         then begin read(p,x);plus(p,x); end
38         else begin read(l,r);writeln(query(r)-query(l-1)); end;
39     end;
40 end.

 

posted on 2016-11-15 19:50  Raymond._.Chen  阅读(224)  评论(0编辑  收藏  举报

导航