1080 线段树练习

1080 线段树练习 

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond 
 
题目描述 Description

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

输入描述 Input Description

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

输出描述 Output Description

共m行,每个整数

样例输入 Sample Input

6

3

4

1 3 5

2 1 4

1 1 9

2 2 6

样例输出 Sample Output

22

22

数据范围及提示 Data Size & Hint

1≤N≤100000, m≤10000 。

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 
 5 const int N = 100100 ;
 6 
 7 int a[N];
 8 int sum[N*4];
 9 int n,m;
10 
11 void update(int rt)
12 {
13     sum[rt] = sum[rt*2] + sum[rt*2+1] ;
14 }
15 void build(int l,int r,int rt) //建立
16 {
17     if(l==r)
18     {
19         sum[rt] = a[l] ;
20         return ;//sum[rt] = a[r];
21     }
22     int m = (l+r) >> 1;
23     build(l,m,rt*2);
24     build(m+1,r,rt*2+1);
25     update(rt) ;
26 } 
27 void modify(int l,int r,int rt,int p,int v) //改变
28 {
29     if(l==r)
30     {
31         sum[rt] += v;
32         return ;
33     }
34     int m = (l+r) >> 1;
35     if(p<=m) modify(l,m,rt*2,p,v);    
36     else modify(m+1,r,rt*2+1,p,v);
37     update(rt);
38 }
39 int query(int l,int r,int rt,int nowl,int nowr) //访问 (注意是int类型函数)
40 {
41     if(nowl<=l && r<=nowr)        
42     {
43         return sum[rt];
44     }
45     int ans=0;
46     int m = (l+r) >> 1;
47     if(nowl<=m) ans+=query(l,m,rt*2,nowl,nowr);      //在左边寻找 
48     if(m<nowr) ans+=query(m+1,r,rt*2+1,nowl,nowr);     //在右边寻找 
49     return ans;
50 }
51 int main()
52 {
53     scanf("%d",&n);
54     for(int i=1;i<=n;++i)
55         scanf("%d",&a[i]);
56     build(1,n,1);
57     scanf("%d",&m);
58     while(m--)
59     {
60         int o,x,a;
61         scanf("%d%d%d",&o,&x,&a);
62         if(o==1) modify(1,n,1,x,a);
63         else printf("%d
",query(1,n,1,x,a));
64     }
65     return 0;
66 }
原文地址:https://www.cnblogs.com/mjtcn/p/6822239.html