区间修改 单点查询

Posted qq-1585047819

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区间修改 单点查询相关的知识,希望对你有一定的参考价值。

技术图片
 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 
 5 const int N=1e5+5;
 6 int n,m;
 7 int sum[N<<2],laze[N<<2]; //延迟标记
 8 
 9 void Update(int rt)
10     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
11 
12 
13 void Updown(int rt,int l,int r)
14     if(laze[rt])
15         laze[rt<<1]+=laze[rt];
16         laze[rt<<1|1]+=laze[rt];
17         int mid=(l+r)>>1;
18         sum[rt<<1]+=laze[rt]*(mid-l+1);
19         sum[rt<<1|1]+=laze[rt]*(r-(mid+1)+1);
20         laze[rt]=0;
21     
22 
23 
24 void Build(int l,int r,int rt)
25     if(l==r) scanf("%d",&sum[rt]);return;
26     int mid=(l+r)>>1;
27     Build(l,mid,rt<<1);
28     Build(mid+1,r,rt<<1|1);
29     Update(rt);  //不要忘记往上更新
30 
31 
32 void Add(int l,int r,int rt,int L,int R,int V)
33     if(L<=l&&R>=r)
34         sum[rt]+=(r-l+1)*V;
35         laze[rt]+=V;  //延迟标记
36         return;
37     
38     Updown(rt,l,r);  //延迟标记往下更新
39     int mid=(l+r)>>1;
40     if(L<=mid) Add(l,mid,rt<<1,L,R,V);
41     if(R>mid) Add(mid+1,r,rt<<1|1,L,R,V);
42     Update(rt);
43 
44 
45 int ans;
46 void query(int l,int r,int rt,int p)
47     if(l==r) ans=sum[rt];return;
48     Updown(rt,l,r);   //用到要更新 延迟标记
49     int mid=(l+r)>>1;
50     if(mid>=p) query(l,mid,rt<<1,p);
51     else query(mid+1,r,rt<<1|1,p);
52 
53 
54 int main()
55 
56     scanf("%d",&n);
57     Build(1,n,1);
58     scanf("%d",&m);
59     while(m--)
60         int flag,a,b,X,p;
61         scanf("%d",&flag);
62         if(flag==1)
63             scanf("%d%d%d",&a,&b,&X); //【a-b】加上X;
64             Add(1,n,1,a,b,X);
65         
66         else if(flag==2) ans=0,scanf("%d",&p),query(1,n,1,p),printf("%d\n",ans);
67     
68     return 0;
69 
View Code

 

以上是关于区间修改 单点查询的主要内容,如果未能解决你的问题,请参考以下文章

树状数组从入门到弃疗

浅析树状数组

P3374 模板树状数组 1(单点修改区间查询)(树状数组)

模板线段树-单点修改,区间查询

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

线段树 P3374 单点修改 区间查询