#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
int n,m,p;//n个结点,m种操作,操作为p
int x,y;//查询的值x或者单点修改x的值加上y
int a,b;//区间查询时使用的区间a,b;
int ans;//存储答案
struct node
{
int left,right;//左右
int weight;//权值
int flag;//延迟标记
} tree[400001];
void build(int k,int ll,int rr)//建树,k是父亲节点,ll、rr左右孩子
{
tree[k].left=ll,tree[k].right=rr;
if(tree[k].left==tree[k].right)//如果是叶子结点,直接赋值
{
scanf("%d",&tree[k].weight);
return;
}
int m=(ll+rr)/2;
build(k*2,ll,m);
build(k*2+1,m+1,rr);
tree[k].weight=tree[k*2].weight+tree[k*2+1].weight;//求区间和,所以父亲结点是左右孩子的和
}
void down(int k)//延迟标记下传
{
tree[k*2].flag+=tree[k].flag;
tree[k*2+1].flag+=tree[k].flag;
tree[k*2].weight+=tree[k].flag*(tree[k*2].right-tree[k*2].left+1);
tree[k*2+1].weight+=tree[k].flag*(tree[k*2+1].right-tree[k*2+1].left+1);
tree[k].flag=0;
}
void ask_point(int k)//单点查询
{
if(tree[k].left==tree[k].right)
{
ans=tree[k].weight;
return ;
}
if(tree[k].flag) down(k);
int m=(tree[k].left+tree[k].right)/2;
if(x<=m) ask_point(k*2);
else ask_point(k*2+1);
}
void change_point(int k)//单点修改,第x个数加上y
{
if(tree[k].left==tree[k].right)
{
tree[k].weight+=y;
return;
}
if(tree[k].flag) down(k);
int m=(tree[k].left+tree[k].right)/2;
if(x<=m) change_point(k*2);
else change_point(k*2+1);
tree[k].weight=tree[k*2].weight+tree[k*2+1].weight;
}
void ask_interval(int k)//区间查询,查询区间和
{
if(tree[k].left>=a&&tree[k].right<=b)
{
ans+=tree[k].weight;
return;
}
if(tree[k].flag) down(k);
int m=(tree[k].left+tree[k].right)/2;
if(a<=m) ask_interval(k*2);
if(b>m) ask_interval(k*2+1);
}
void change_interval(int k)//区间修改,把a-b之间数改成k
{
if(tree[k].left>=a&&tree[k].right<=b)
{
tree[k].weight+=(tree[k].right-tree[k].left+1)*y;
tree[k].flag+=y;
return;
}
if(tree[k].flag) down(k);
int m=(tree[k].left+tree[k].right)/2;
if(a<=m) change_interval(k*2);
if(b>m) change_interval(k*2+1);
tree[k].weight=tree[k*2].weight+tree[k*2+1].weight;
}
int main()
{
scanf("%d",&n);//n个节点
build(1,1,n);//建树,传值根节点1,左孩子1,有孩子n
scanf("%d",&m);//m种操作
for(int i=1; i<=m; i++)
{
scanf("%d",&p);
ans=0;
/*以下操作传值过去的为根节点1*/
if(p==1)
{
scanf("%d",&x);
ask_point(1);//单点查询,输出第x个数
printf("%d",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);
}
}
}
相关推荐
英飞凌AURIX™ Development Studio(ADS)工程调试与烧录实战指南
本文详细介绍了英飞凌AURIX™ Development Studio(ADS)的工程调试与烧录实战指南。从调试环境搭建、硬件连接到断点设置、变量监控等核心调试技巧,帮助开发者快速掌握ADS安装使用教程,提升多核处理器开发效率。
【模板】我自己的线段树
自用线段树模板,如果你觉得有用就学习学习吧~
高杂合度基因组组装实战:Hifiasm参数调优与purge_dups过滤效果对比(附猪毛菜案例)
本文深入探讨了高杂合度基因组组装中Hifiasm参数调优与purge_dups过滤的实战效果对比,通过猪毛菜案例详细解析了两种方法的适用场景与优化策略。文章重点分析了purge_dups在contig过滤中的显著效果,为基因组组装提供了关键的技术参考。
线段树 - 模板
线段树板子0: #include<cstdio> #include<iostream> #define ll long long #define _for(i,a,b) for(ll i = (a);i < (b); ++i) using namespace std; const ll maxn = 1e5+5; void build_tree(ll arr[],ll tree[],ll node,ll start,ll end){ //printf("Start : %
别再怕DRIVER_VERIFIER_DMA_VIOLATION蓝屏:手把手教你用WinDbg分析IOMMU与驱动冲突
本文深入解析DRIVER_VERIFIER_DMA_VIOLATION蓝屏错误,从IOMMU原理到实战排错,手把手教你使用WinDbg分析驱动冲突。通过理解DMA与IOMMU的核心机制、搭建分析环境、解读DMAR表与设备拓扑,最终定位问题驱动并提供解决方案,帮助开发者和IT运维人员有效应对此类系统崩溃问题。
不写代码,Cursor 10分钟开发1个APP!保姆级教程喂饭来了
做出第一个能运行的app,那种成就感真的很棒。虽然过程可能有点折腾,但只要耐心一点,问题都能解决。记住,遇到问题不要慌,现在有AI帮忙,大部分问题都能快速解决。重要的是迈出第一步,开始动手实践。你的第一个app可能很简单,但这是一个很好的开始。随着经验积累,你能做出的东西会越来越酷。现在就开始行动吧,说不定下个月你就能向朋友炫耀你自己做的app了!
刘汝佳 线段树模板
一、线段树(点修改) update
k8s集群部署私有镜像仓库
本文介绍了在Kubernetes集群中部署私有镜像仓库的完整方案。使用registry:2镜像创建Deployment,通过NodePort(30500)暴露服务,并采用hostPath(/data/registry)实现数据持久化。部署过程包括节点标记、YAML配置、资源创建及验证步骤,同时提供了Docker和Containerd两种环境下的详细使用方法,包括配置不信任私有仓库、镜像推送/拉取操作指南。该方案特别适合开发测试环境,为团队提供便捷的本地镜像管理能力。
线段树模板整理
综述线段树的原理:将[1,n]分解成若干特定的子区间(数量不超过4*n),然后,将每个区间[L,R]都分解为少量特定的子区间,通过对这些少量子区间的修改或者统计,来实现快速对[L,R]的修改或者统计。 作用:对编号连续的一些点的区间信息进行修改或者统计操作 主要操作:区间查询、点更新、区间更新 时间复杂度:修改和统计的复杂度都是O(log(N))由原理可以看出线段树维护的信息必须满足区间加法
Windows电脑如何用MobaXterm连接宇树G1机器人?保姆级SSH配置指南
本文提供了一份详细的保姆级教程,指导Windows用户使用MobaXterm通过SSH连接宇树G1机器人。内容涵盖从物理网络配置、MobaXterm安装与SSH会话创建,到文件传输、X11转发等高级功能,并包含常见问题排查与安全加固建议,帮助开发者快速建立稳定可靠的远程开发连接。
YOLOv11改进入门篇 | 手把手讲解改进模块如何实现高效涨点,以SimAM注意力模块为例
本文记录的是基于SimAM注意力模块的YOLOv11目标检测方法研究。SimAM注意力模块通过优化能量函数来获得每个神经元的三维权重,而或增加计算复杂度。若是有轻量化需求的小伙伴,无参的注意力模块也许是一个不错的选择。
线段树 模板题 笔记
线段树 模板题 笔记
11.8 LangGraph生产级AI Agent开发:从节点定义到高并发架构的终极指南
本文介绍了如何使用 LangGraph 构建生产级 AI Agent,重点解析了 LangGraph 的核心设计、节点与边的实现方法论、生产级实现技巧以及性能优化策略。LangGraph 通过图结构抽象复杂 AI 工作流,核心组件包括节点、边、状态和检查点。节点通过 Python 函数封装原子业务逻辑,边通过条件分支实现动态工作流。生产级实现技巧包括状态管理、多会话控制和错误处理机制。性能优化策略涉及并行执行和缓存机制设计。文章还提供了旅行规划 Agent 的实战案例和常见问题解决方案,帮助开发者构建高效、
线段树模板1
#include<stdio.h> const int MAXN =2e5+5; typedef long long ll; //次模板一般用于大数据,开long long int numbers[MAXN]; struct node{ int l=0,r=0;//左 右结点 int val=0;//该点的值 }tree[MAXN*4]; // /* 模板大意:对n个数,...
WINCC7.3破解文件
WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!
锂电池充电器电路设计 里面有电路
锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。
线段树 模板之求和
本人水平有限,题解不到为处,请多多谅解 本蒟蒻谢谢大家观看 题目: Problem A: 线段树之Sum Time Limit:1 SecMemory Limit:128 MBSubmit:187Solved:130[Submit][Status][Web Board] Description 给定一数列,规定有两种操作,一是修改某个元素,二是...
IEM模型,地表粗糙度模拟
利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟
线段树--模板
线段树的命名tree线段树的创建 build线段树的查询 query10月4日的线段树模板(现更新)问题:不够简洁#include<iostream> using namespace std; const int maxind=256; int segTree[maxind*4+10]; int array[maxind]; bool flag=false; inline min(in...
精雕软件(JDpaint) 5.5 绿色版
精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版
【模板】线段树
【模板】线段树本篇博文只有模板,emmm。 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。 使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。而未优化的空间复杂度为2N,实际应用时一般还要开4N的数组以免越界,因此有时需要离散化让空间压缩。——摘自百度百科 因此,线段树是一种复杂度极为优秀(
线段树模板(对应洛谷一道线段树模板题)
*最近正好在学线段树,搞懂后写一篇博客记录一下模板,供日后自己学习参考*
线段树 模板题整理
线段树模板题整理 (基于洛谷OJ) 1.P3372 【模板】线段树 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 将某区间每一个数加上 kk。 求出某区间每一个数的和。 输入格式 第一行包含两个整数 n, mn,m,分别表示该数列数字的个数和操作的总个数。 第二行包含 nn 个用空格分隔的整数,其中第 ii 个数字表示数列第 ii 项的初始值。 接下来 mm 行每行包含 33 或 44 个整数,表示一个操作,具体如下: 1 x y k:将区间 [x, y][x,y] 内每个数加上 kk。 2
线段树[模板]
建树 #define Ln(x) x << 1 #define Rn(x) (x << 1) | 1 struct SegTree{ int l, r, data, lazy; SegTree(int l=0, int r=0, int data=0, int lazy=0): l(l), r(r), data(data), lazy(lazy) {}; }t...
线段树模板+习题
线段树自用模板 #include <iostream> using namespace std; const int MAX_N=10010; int s[MAX_N<<2]; void up(int p) { s[p]=s[p<<1]+s[p<<1|1]; } void modify(int p,int ...
571



被折叠的 条评论
为什么被折叠?



