线段树练习五

来源:互联网 发布:interbase数据库启动 编辑:程序博客网 时间:2024/05/22 02:06

Description

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

Input

20 //方格个数
6 //有几组操作
M 1 1 //表示修改,第一个表示格子位置,第二个数表示在原来的基础上加上的数,
M 2 2
M 3 4
M 3 -5
M 6 7
C 2 6 //表示统计 ,第一个数表示起始位置,第二个数表示结束位置

Output

8
做法:维护一个区间sum。。其实也是模板题
代码如下:

#include <cstdio>#include <iostream>#include <cstring>using namespace std;int c[1000000],n,m;char s;void update(int p,int l,int r,int x,int add){    int m=(l+r) / 2;    if (l==r)    {        c[p]+=add;        return;    }    if (x<=m)   update(p*2,l,m,x,add);    if (x>m)    update(p*2+1,m+1,r,x,add);    c[p]=c[p<<1]+c[p<<1|1];}int find(int p,int l,int r,int a,int b){    if (l==a && r==b)   return c[p];    else    {        int m=(l+r) / 2;        if (b<=m)   return find(p*2,l,m,a,b);        else if (a>m)   return find(p*2+1,m+1,r,a,b);        else return find(p*2,l,m,a,m)+find(p*2+1,m+1,r,m+1,b);    }}int main(){    scanf("%d",&n);    scanf("%d",&m);    for (int i=1;i<=m;i++)    {        cin>>s;        if (s=='M')        {               int x,y;            scanf("%d%d",&x,&y);            update(1,1,n,x,y);        }        if (s=='C')        {            int x,y;            scanf("%d%d",&x,&y);            printf("%d\n",find(1,1,n,x,y));        }    }}
原创粉丝点击