首页 > 其他分享 >线段树(单点修改,区间查询)

线段树(单点修改,区间查询)

时间:2023-04-13 23:46:48浏览次数:46  
标签:输出 单点 数列 int 个数 线段 tr 查询 区间

题目描述

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

  • 将某一个数加上 x

  • 求出某区间每一个数的和

输入格式

第一行包含两个正整数 n,m,分别表示该数列数字的个数和操作的总个数。

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

接下来 m 行每行包含 33 个整数,表示一个操作,具体如下:

  • 1 x k 含义:将第 x 个数加上 k

  • 2 x y 含义:输出区间 [x,y] 内每个数的和

输出格式

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

输入输出样例

输入 #1  
5 5
1 5 4 2 3
1 1 3
2 2 5
1 3 -1
1 4 2
2 1 4
输出 #1  
14
16

说明/提示

【数据范围】

对于 30% 的数据,1≤n≤8,1≤m≤10;
对于 70% 的数据,1≤n,m≤1e4;
对于 100%的数据,1≤n,m≤5e5。

数据保证对于任意时刻,a 的任意子区间(包括长度为 1 和 n 的子区间)和均在 [−2^31,2^31) 范围内。

样例说明:

故输出结果14、16

代码实现:

#include<iostream>
#include<algorithm>
using namespace std;
#define int long long
const int N=5e5+5;
int n,m;
int a[N];
struct node{
	int l,r,sum;
}tr[N*4];
void pushup(int u){
	tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
}
void build(int u,int l,int r){
	tr[u]={l,r};
	if(l==r){
		tr[u].sum=a[l];
		return;
	}
	int mid=l+r>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	pushup(u);
}
void modify(int u,int x,int z){
	if(tr[u].l==x&&tr[u].r==x)tr[u].sum+=z;
	else{
		int mid=tr[u].l+tr[u].r>>1;
		if(x<=mid)modify(u<<1,x,z);
		else modify(u<<1|1,x,z);
		pushup(u);
	}
}
int query(int u,int l,int r){
	if(tr[u].l>=l&&tr[u].r<=r)return tr[u].sum;
	int mid=tr[u].l+tr[u].r>>1;
	int res=0;
	if(r<=mid)res=query(u<<1,l,r);
	else if(l>mid)res=query(u<<1|1,l,r);
	else res=query(u<<1,l,mid)+query(u<<1|1,l,r);
	return res;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	while(m--){
		int a,b,c;
		cin>>a>>b>>c;
		if(a==1)modify(1,b,c);
		else cout<<query(1,b,c)<<endl;
	}
	return 0;
}

 

标签:输出,单点,数列,int,个数,线段,tr,查询,区间
From: https://www.cnblogs.com/hxss/p/17316983.html

相关文章

  • POJ 2299 Ultra-QuickSort(线段树+离散化)
    题目地址:POJ2299这题曾经用归并排序做过,线段树加上离散化也可以做。一般线段树的话会超时。这题的数字最大到10^10次方,显然太大,但是可以利用下标,下标总共只有50w。可以从数字大的开始向树上加点,然后统计下标比它小即在它左边的数的个数。因为每加一个数的时候,比该数大的数已经加完......
  • POJ 3468 A Simple Problem with Integers(线段树区间更新)
    题目地址:POJ3468打了个篮球回来果然神经有点冲动。。无脑的狂交了8次WA。。居然是更新的时候把r-l写成了l-r。。。这题就是区间更新裸题。区间更新就是加一个lazy标记,延迟标记,只有向下查询的时候才将lazy标记向下更新。其他的均按线段树的来就行。代码如下:#include<iostream>#in......
  • HDU 1166 敌兵布阵(线段树)
    题目地址:HDU1166听说胡浩版的线段树挺有名的。于是就拜访了一下他的博客。详情戳这里。于是就完全仿照着胡浩大牛的风格写的代码。至于原理,鹏鹏学长已经讲的再清晰不过了。我就在下面的代码注释中将原理说明一下吧。来纪念第一发线段树。下面是代码+注释。#include<iostream>#in......
  • ZOJ 3886 Nico Number (线段树)
    题目地址:ZJU3886这个题需要想到一点,因为对一个数x不断取模的话,而且设定他小于模才会进行取余操作的话,那么最多只会进行logx次,因为每次取模都会使x最少折半。然后想到了这点就很好做了。对于区间取模更新操作可以直接暴力更新,维护一个最大值,如果这个区间的最大值小于模的话,就......
  • mysql 数据迁移与查询更新
    业务前景:在旧表中新增ch类型字段,以ch字段作为查询条件,为了不产生影响,需要对ch字段进行更新操作,ch字段源于base字段json格式中的一部分。  解决方案:1) 字段迁移updatereported_datasetch=base; 2)查询后更新updatereported_datasetch=(SELECTSUBS......
  • mysql多表查询
    查询加强查询到的表的结构--查询加强--使用where语句--1.如果查找1991.1.1后入职的员工--注意:mysql,日期类型可以直接比较,需要注意和表中的格式一致SELECT*FROMempWHEREhiredate>'1991.1.1';--2.使用like操作符(模糊)--%:表示0到多个任意字符_:表示单个任......
  • Kibana查询语法使用手册【转】
    阅读目录全文搜索按字段搜索通配符搜索匹配单一字符匹配任意多个字符范围搜索布尔搜索分组搜索转义特殊字符速查全文搜索在搜索栏输入login,会返回所有字段值中包含login的文档使用双引号包起来作为一个短语搜索"likeGecko" 也可以按页面左侧显示的字段搜索限定......
  • Mybatis_06 _查询语句对应关系
    Mybatis_06对应关系多对一:使用关联association一对多:使用集合collection创建SQL表:CREATETABLE`teacher`(`id`INT(10)NOTNULL,`name`VARCHAR(30)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=INNODBDEFAULTCHARSET=utf8CREATETABLE`student`(`id`INT(10......
  • mysql,dorics数据库查询不同类型数据前10条信息
    selectt1.id,t1.namefrom(selectt.id,t.name,row_number()over(partitionbyt.idorderbyt.date)rnfromAt)t1wheret1.rn<=10;结果如下:  ......
  • 【实践篇】基于CAS的单点登录实践之路
    作者:京东物流 赵勇萍前言上个月我负责的系统SSO升级,对接京东ERP系统,这也让我想起了之前我做过一个单点登录的项目。想来单点登录有很多实现方案,不过最主流的还是基于CAS的方案,所以我也就分享一下我的CAS实践之路。什么是单点登录单点登录的英文名叫做:SingleSignOn(简称SSO)。......