热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CodeForces315B:线段树与区间更新

题目概述:Sereja拥有一个由n个整数组成的数组a1,a2,...,an。他计划执行m项操作,这些操作包括更新数组中的特定元素、增加数组中所有元素的值,以及查询数组中的特定元素。

题目描述:

Sereja 拥有一个包含 n 个整数的数组 a1, a2, ..., an。他非常活跃,计划执行 m 次操作。这 m 次操作分为三种类型:

  1. 将第 vi 个数组元素设置为 xi。即执行 avi = xi。
  2. 将每个数组元素增加 yi。即对所有的 ai 执行 ai = ai + yi (1 ≤ i ≤ n)。
  3. 在纸上写下第 qi 个数组元素的值。即查询 aqi 的值。

请帮助 Sereja 完成所有这些操作。

输入

第一行包含两个整数 n 和 m (1 ≤ n, m ≤ 10^5),表示数组的长度和操作的数量。第二行包含 n 个用空格分隔的整数 a1, a2, ..., an (1 ≤ ai ≤ 10^9),表示原始数组的内容。

接下来的 m 行描述了 m 次操作,第 i 行描述了第 i 次操作。每行的第一个整数 ti (1 ≤ ti ≤ 3) 表示操作类型。如果 ti = 1,则后跟两个整数 vi 和 xi (1 ≤ vi ≤ n, 1 ≤ xi ≤ 10^9);如果 ti = 2,则后跟一个整数 yi (1 ≤ yi ≤ 10^4);如果 ti = 3,则后跟一个整数 qi (1 ≤ qi ≤ n)。

输出

对于每次第三类操作,输出对应的 aqi 值。按照输入中查询出现的顺序输出结果。

样例

输入

10 11
1 2 3 4 5 6 7 8 9 10
3 2
3 9
2 10
3 1
3 10
1 1 10
2 10
2 10
3 1
3 10
3 9

输出

2
9
11
20
30
40
39

问题分析:此问题可以通过使用线段树来高效地处理区间更新和单点查询。

解决方案代码

#include 
#include
#include
#include
using namespace std;
const int maxn = 1e5 + 100;
struct Node {
int l, r, val;
} tree[maxn * 4];
int a[maxn];

void build(int root, int l, int r) {
tree[root].l = l;
tree[root].r = r;
tree[root].val = 0;
if (l == r) {
tree[root].val = a[l];
return;
}
int mid = (l + r) >> 1;
build(root <<1, l, mid);
build(root <<1 | 1, mid + 1, r);
}

void pushdown(int root) {
if (tree[root].val != 0) {
tree[root <<1].val += tree[root].val;
tree[root <<1 | 1].val += tree[root].val;
tree[root].val = 0;
}
}

void update(int root, int l, int r, int cur, int op) {
if (l <= tree[root].l && r >= tree[root].r) {
if (op == 2) tree[root].val += cur;
else tree[root].val = cur;
return;
}
pushdown(root);
int mid = (tree[root].l + tree[root].r) >> 1;
if (l <= mid) update(root <<1, l, r, cur, op);
if (r > mid) update(root <<1 | 1, l, r, cur, op);
}

int query(int root, int pos) {
if (tree[root].l == tree[root].r) {
return tree[root].val;
}
pushdown(root);
int mid = (tree[root].l + tree[root].r) >> 1;
if (pos <= mid) return query(root <<1, pos);
else return query(root <<1 | 1, pos);
}

int main() {
int n, m;
while (scanf("%d%d", &n, &m) != EOF) {
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
build(1, 1, n);
for (int i = 1; i <= m; i++) {
int t;
scanf("%d", &t);
if (t == 1) {
int pos, x;
scanf("%d%d", &pos, &x);
update(1, pos, pos, x, 1);
} else if (t == 2) {
int v;
scanf("%d", &v);
update(1, 1, n, v, 2);
} else if (t == 3) {
int pos;
scanf("%d", &pos);
printf("%d\n", query(1, pos));
}
}
}
return 0;
}

推荐阅读
  • egg实现登录鉴权(七):权限管理
    权限管理包含三部分:访问页面的权限,操作功能的权限和获取数据权限。页面权限:登录用户所属角色的可访问页面的权限功能权限:登录用户所属角色的可访问页面的操作权限数据权限:登录用户所属 ... [详细]
  • 题目描述:Balala Power! 时间限制:4000/2000 MS (Java/Other) 内存限制:131072/131072 K (Java/Other)。题目背景及问题描述详见正文。 ... [详细]
  • Gradle 是 Android Studio 中默认的构建工具,了解其基本配置对于开发效率的提升至关重要。本文将详细介绍如何在 Gradle 中定义和使用共享变量,以确保项目的一致性和可维护性。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • LeetCode 102 - 二叉树层次遍历详解
    本文详细解析了LeetCode第102题——二叉树的层次遍历问题,提供了C++语言的实现代码,并对算法的核心思想和具体步骤进行了深入讲解。 ... [详细]
  • 探讨了一个包含纯虚函数的C++代码片段,分析了其中的语法错误及逻辑问题,并提出了修正方案。 ... [详细]
  • Hanks博士是一位著名的生物技术专家,他的儿子Hankson对数学有着浓厚的兴趣。最近,Hankson遇到了一个有趣的数学问题,涉及求解特定条件下的正整数x,而不使用传统的辗转相除法。 ... [详细]
  • 网络流24题——试题库问题
    题目描述:假设一个试题库中有n道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性。现要从题库中抽取m道题组成试卷。并要求试卷包含指定类型的试题。试设计一个满足要求的组卷算 ... [详细]
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • 编程解析:CF989C 花朵之雾 (构造算法)
    本文深入探讨了CF989C '花朵之雾'问题的构造算法,提供了详细的解题思路和代码实现。 ... [详细]
  • ArcBlock 发布 ABT 节点 1.0.31 版本更新
    2020年11月9日,ArcBlock 区块链基础平台发布了 ABT 节点开发平台的1.0.31版本更新,此次更新带来了多项功能增强与性能优化。 ... [详细]
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • 本文详细介绍了在Luat OS中如何实现C与Lua的混合编程,包括在C环境中运行Lua脚本、封装可被Lua调用的C语言库,以及C与Lua之间的数据交互方法。 ... [详细]
  • hlg_oj_1116_选美大赛这题是最长子序列,然后再求出路径就可以了。开始写的比较乱,用数组什么的,后来用了指针就好办了。现在把代码贴 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
author-avatar
我只当你的千纸鹤
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有