题目描述 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

4

5

6

2

1

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 。

树状数组:

转载一篇详解:http://blog.csdn.net/hanhai768/article/details/37822773

 #include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std; int n,m;
int f[]; int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-f;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} int lowbit(int x)
{
return x&(-x);
} void update(int x,int num)
{
while(x<=n)
{
f[x]+=num;
x+=lowbit(x);
}
} int sum(int x)
{
int sum=;
while(x>)
{
sum+=f[x];
x-=lowbit(x);
}
return sum;
} int main()
{
n=read();
for(int i=;i<=n;i++)
update(i,read());
m=read();
for(int i=;i<=m;i++)
{
int a=read(),x=read(),y=read();
if(a==)update(x,y);
if(a==)printf("%d\n",sum(y)-sum(x-));
}
return ;
}

线段树:

 #include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std; struct data
{
int l,r,sum;
}tree[];
int n,m,a[]; int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-f;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} void build(int k,int s,int t)
{
tree[k].l=s;tree[k].r=t;
if(s==t){tree[k].sum=a[s];return;}
int mid=(s+t)>>;
build(k<<,s,mid);
build(k<<|,mid+,t);
tree[k].sum=tree[k<<].sum+tree[k<<|].sum;
} int sum(int k,int s,int t)
{
int l=tree[k].l,r=tree[k].r;
if(s==l&&t==r) return tree[k].sum;
int mid=(l+r)>>;
if(t<=mid) return sum(k<<,s,t);
if(s>mid) return sum(k<<|,s,t);
return sum(k<<,s,mid)+sum(k<<|,mid+,t);
} void update(int k,int x,int y)
{
tree[k].sum+=y;
int l=tree[k].l,r=tree[k].r;
if(l==r) return;
int mid=(l+r)>>;
if(x<=mid) update(k<<,x,y);
else update(k<<|,x,y);
} int main()
{
n=read();
for(int i=;i<=n;i++)
a[i]=read();
build(,,n);
m=read();
for(int i=;i<=m;i++)
{
int a=read(),b=read(),c=read();
if(a==) update(,b,c);
if(a==) printf("%d\n",sum(,b,c));
}
return ;
}

zkw线段树:张昆玮 神的不能再神了

 #include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std; const int M=; int n,m;
int f[]; int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-f;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} void update(int x,int num)
{
for(f[x+=M]+=num,x>>=;x;x>>=)
f[x]=f[x<<]+f[x<<|];
} int query(int s,int t)
{
int ans=;
for(s=s+M-,t=t+M+;s^t^;s>>=,t>>=)
{
if(~s&) ans+=f[s^];
if(t&) ans+=f[t^];
}
return ans;
} int main()
{
n=read();
for(int i=;i<=n;i++)
update(i,read());
m=read();
for(int i=;i<=m;i++)
{
int a=read(),x=read(),y=read();
if(a==)update(x,y);
if(a==)printf("%d\n",query(x,y));
}
return ;
}

最新文章

  1. python(四)函数
  2. cocos2dx之lua派生类和方法重新
  3. Linux启动Apache支持.htaccess伪静态文件方法
  4. 用Intellij Idea创建简单的Servlet
  5. SQL Server 数据类型映射 (ADO.NET)
  6. LINQ简单案例
  7. WEB项目(B/S系统)打包安装(总结篇)
  8. HDU 3183 A Magic Lamp(二维RMQ)
  9. gsoap创建webservice服务简单教程
  10. 获取SpringMVC的映射路径
  11. MySQL一对一:一对多:多对多: 实例!!!!
  12. Cocos2D:变换(transforms)在图形编程中扮演的角色
  13. 3Delight feats. OpenVDB
  14. PAT (Basic Level) Practise - 成绩排名
  15. 4535 ACM 礼尚往来 数学排列组合
  16. Redux DevTools浏览器插件调试redux
  17. EBADF, read
  18. POJ3693(SummerTrainingDay10-J 后缀数组)
  19. python函数嵌套的实用技术
  20. 5.18-笨办法学python-习题17(文件拷贝)

热门文章

  1. python-django框架中使用FastDFS分布式文件系统
  2. JSF 与 struts2
  3. NSPhotoLibraryAddUsageDescription解决办法
  4. Django之Form的ModelForm
  5. HDU-2586-How far away(LCA Tarjan离线算法)
  6. 基于.NetCore2.1。服务类库采用.Net Standard2.0,兼容.net 4.6.1消息推送服务
  7. Net Core2.0 基于QuartzNet任务管理系统
  8. Nginx托管.Net Core应用程序
  9. 破解百度翻译页面api参数加密
  10. Cube中维度排序-通过在数据仓库增加列来实现排序