题目描述

如题,已知一个数列,你需要进行下面两种操作:

1.将某区间每一个数加上x

2.求出某区间每一个数的和

输入输出格式

输入格式:

第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。

第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。

接下来M行每行包含3或4个整数,表示一个操作,具体如下:

操作1: 格式:1 x y k 含义:将区间[x,y]内每个数加上k

操作2: 格式:2 x y 含义:输出区间[x,y]内每个数的和

输出格式:

输出包含若干行整数,即为所有操作2的结果。

输入输出样例

输入样例#1:

5 5
1 5 4 2 3
2 2 4
1 2 3 2
2 3 4
1 1 5 1
2 1 4
输出样例#1:

11
8
20

说明

时空限制:1000ms,128M

数据规模:

对于30%的数据:N<=8,M<=10

对于70%的数据:N<=1000,M<=10000

对于100%的数据:N<=100000,M<=100000

(数据已经过加强^_^,保证在int64/long long数据范围内)

样例说明:

在这里提醒大家一点

如果你用的是Dev-c++的5.92版本的话,用%lld输入可能会发生运行时错误

这时候如果你确保你的程序百分百对的话,可以直接提交

如果你不放心自己的程序,可以把%lld改成%I64d(I是大写i)进行调试,这样就不会出错了

但是切记

提交到洛谷上的时候一定要写%lld!!!!!!

否则全部WA而不是RE

切记切记

(ps:cena评测系统也是%lld)

我的代码基本是由函数构成的

写法比较通俗易懂

大家可以参考一下

再教大家一个小技巧:

如果你想要大批量的吧int改为long long int 的话

可以使#define 语句

然后用查找替换功能

注意查找的时候 查找的是 int+空格

否则你的printf会变得非常美观(手动滑稽)

 #include<iostream>
#include<cstdio>
#include<cstring>
#define lglg long long int
using namespace std;
const lglg MAXN=;
lglg n,m;
lglg ans=;
struct node
{
lglg l,r,w,f;
}tree[MAXN*];
inline void updata(lglg k)
{
tree[k].w=tree[k*].w+tree[k*+].w;
}
inline void build(lglg k,lglg ll,lglg rr)
{
tree[k].l=ll;tree[k].r=rr;
if(tree[k].l==tree[k].r)
{
scanf("%lld",&tree[k].w);
return ;
}
lglg m=(ll+rr)/;
build(k*,ll,m);
build(k*+,m+,rr);
updata(k);
}
inline void down(lglg k)
{
tree[k*].f+=tree[k].f;
tree[k*+].f+=tree[k].f;
tree[k*].w+=(tree[k*].r-tree[k*].l+)*tree[k].f;
tree[k*+].w+=(tree[k*+].r-tree[k*+].l+)*tree[k].f;
tree[k].f=;
}
inline void interval_change(lglg k,lglg ll,lglg rr,lglg v)
{
if(tree[k].l>=ll&&tree[k].r<=rr)
{
tree[k].w+=(tree[k].r-tree[k].l+)*v;
tree[k].f+=v;
return ;
}
if(tree[k].f) down(k);
lglg m=(tree[k].l+tree[k].r)/;
if(ll<=m) interval_change(k*,ll,rr,v);
if(rr>m) interval_change(k*+,ll,rr,v);
updata(k);
}
inline void interval_ask(lglg k,lglg ll,lglg rr)
{
if(tree[k].l>=ll&&tree[k].r<=rr)
{
ans+=tree[k].w;
return ;
}
if(tree[k].f) down(k);
lglg m=(tree[k].l+tree[k].r)/;
if(ll<=m)
interval_ask(k*,ll,rr);
if(rr>m)
interval_ask(k*+,ll,rr);
}
int main()
{
scanf("%lld",&n);
scanf("%lld",&m);
build(,,n);
while(m--)
{
lglg how;
scanf("%lld",&how);
if(how==)//区间增加
{
lglg x,y,v;
scanf("%lld%lld%lld",&x,&y,&v);
interval_change(,x,y,v);
}
else//区间求和
{
lglg x,y;
ans=;
scanf("%lld%lld",&x,&y);
interval_ask(,x,y);
printf("%lld\n",ans);
}
}
return ;
}

最新文章

  1. Kotlin中变量不同于Java: var 对val(KAD 02)
  2. IndexOf、IndexOfAny 、Remove
  3. Node.js学习之简介
  4. 开源倾情奉献:基于.NET打造IP智能网络视频监控系统(一)开放源代码
  5. &quot;SQLServer无法打开用户默认数据库,登录失败,错误4064&quot;的解决办法
  6. Gridview的RowDataBound事件(添加删除提示,改变背景颜色)
  7. WPF基础——Application
  8. phpwind8.7升级9.0.1过程(一)本地和服务器数据同步的部署
  9. 【BZOJ2793】【数学】[Poi2012]Vouchers
  10. 利用NSIS软件制作C#安装包
  11. js 获取元素在页面上的偏移量的最佳方式
  12. Hbase 基础 - shell 与 客户端
  13. C#-导入Excel 内容到 DataTable中
  14. UOJ176 新年的繁荣
  15. codeforces 13EE. Holes(分块&amp;amp;动态树)
  16. VS中空项目、win32项目、控制台程序的区别(转)
  17. Nodejs学习笔记(九)—与Redis的交互(mranney/node_redis)入门
  18. vue引入elementUI 报错
  19. SqlServer数据库(可疑)解决办法4种
  20. Lucene:基于Java的全文检索引擎简介 (zhuan)

热门文章

  1. POJ3685 Matrix —— 二分
  2. Do not throw System.Exception, System.SystemException, System.NullReferenceException, or System.IndexOutOfRangeException intentionally from your own source code
  3. 第三届蓝桥杯C++B组省赛
  4. 如何使用BMap.Point传递变量、存储数据?
  5. SPOJ:String Play (?)
  6. bzoj3143游走——期望+高斯消元
  7. ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 03. 服务注册和管道
  8. 斯坦福CS231n—深度学习与计算机视觉----学习笔记 课时6
  9. XTU1267:Highway(LCA+树的直径)
  10. LIS LCS LCIS (主要过一遍,重在做题)