线段树(含懒标记)模板

理解分析:链接

#include <iostream>
using namespace std;
typedef  long long ll;
int n,m, a, b, x, y,p, ans;
struct  node{
	int l, r, w, f;
}tree[400005];


void Build(int k,int ll,int rr) {   //建树
	tree[k].l = ll, tree[k].r = rr;
	if (tree[k].r == tree[k].l) {
		scanf("%d", &tree[k].w);
		return;
	}
	int mid = (ll + rr) / 2;
	Build(k * 2, ll, mid);
	Build(k * 2 + 1, mid + 1, rr);
	tree[k].w = tree[k * 2].w + tree[k * 2 + 1].w;
}

void Down(int k) {      //标记下传
	tree[k * 2].f += tree[k].f;
	tree[k * 2 + 1].f += tree[k].f;
	tree[k * 2].w += tree[k].f*(tree[k * 2].r - tree[k * 2].l + 1);
	tree[k * 2+1].w += tree[k].f*(tree[k * 2+1].r - tree[k * 2+1].l + 1);
	tree[k].f = 0;
}


void Ask_Point(int k) {  //单点查询
	if (tree[k].r == tree[k].l) {
		ans = tree[k].w;
		return;
	}
	if (tree[k].f)Down(k);
	int mid = (tree[k].l + tree[k].r) / 2;
	if (x <= mid)Ask_Point(k * 2);
	else Ask_Point(k * 2 + 1);
}


void Change_Point(int k) {  //单点修改
	if (tree[k].r == tree[k].l) {
		tree[k].w += y;
		return;
	}
	if (tree[k].f)Down(k);
	int mid = (tree[k].l + tree[k].r) / 2;
	if (x <= mid)Change_Point(k * 2);
	else Change_Point(k * 2 + 1);
	tree[k].w = tree[k * 2].w + tree[k * 2 + 1].w;
}


void Ask_Interval(int k) {           //区间查询
	if (tree[k].l >= a && tree[k].r <= b) {
		ans += tree[k].w;
		return;
	}
	if (tree[k].f)Down(k);
	int mid = (tree[k].r + tree[k].l) / 2;
	if (a <= mid)Ask_Interval(k * 2);
	if (b > mid)Ask_Interval(k * 2 + 1);
}


void  Change_Interval(int k) {
	if (tree[k].l >= a && tree[k].r <= b) {
		tree[k].w += (tree[k].r-tree[k].l+1)*y;
		tree[k].f+=y;   //注意不要遗漏!!! 
		return;
	}
	if (tree[k].f)Down(k);
	int mid = (tree[k].r + tree[k].l) / 2;
	if (a <= mid)Change_Interval(k * 2);
	if (b > mid)Change_Interval(k * 2 + 1);
	tree[k].w = tree[k * 2].w + tree[k * 2 + 1].w;
}
int main() {
	scanf("%d%d", &n,&m);
	Build(1, 1, n);
	for (int i = 1; i <= m; i++)
	{
		scanf("%d", &p);
		ans = 0;
		if(p == 1) {
			scanf("%d", &x);
			Ask_Point(1);
			printf("%d\n",ans);
		}
		else if (p == 2) {
			scanf("%d%d", &x,&y);
			Change_Point(1);
		}
		else if (p == 3) {
			scanf("%d%d", &a, &b);
			Ask_Interval(1);
			printf("%d\n", ans);
		}
		else {
			scanf("%d%d%d", &a, &b, &y);
			Change_Interval(1);
		}
	}
	return 0;
}

阿里云建站—为企业提供互联网“快”服务

2020年因为一场突如其来的疫情,不少企业受到了严重冲击,疫情的冲击力对传统“纯线

下”行业的危害最大,互联网女皇玛丽·米克(MaryMeeker)4月17日发布了著名的年度互

联网趋势报告,报告中指出:拥有强大的互联网线上线下融合能力的企业在疫情中的表现最好,

线上线下融合的趋势已经存在一段时间了,但是疫情让这种需求变得更加的迫切。

如果你的企业完全依附于传统的、纯线下的经验模式,那么在2020年你将“必死无疑”,

一场巨大的,前所未有的互联网革命已经到来!

阿里云建站为了助力各行各业复工复产,疫情期间“马不停蹄”为数以万计的企业快速完成

建站,为他们朝着“线上线下融合”或者“纯线上”的互联网经营模式迈进,打下了坚实的基础。

“云·速成美站”模板建站1天就能上线,不懂技术没关系,打字就能建网站。千套网站模

板免费提供,百元就能建官网,一价全包,无任何隐形消费。

“云·企业官网”定制建站1周就能上线,高端量身定制建站,千元建官网无需自己动手,

建站专家1对1网站策划及设计,专业省心之选。

疫情,是一场大浪淘沙,每一次危机背后都隐藏着机会,危机越大,机会也越大。大环境

已经改变,如果你不努力不去改变来迎合这个大环境,那你必将被淘汰。

阿里云助力企业建站,优惠多多,福利多多,详情请点击如下链接

https://www.aliyun.com/minisite/goods?userCode=tz7kl4ag

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值