1 /* 2 段改求点 3 用树状数组维护差分数组 4 因为a[i]=d[1]...d[i] 5 所以用差分数组的化就很好进行查询操作 6 至于区间修改,因为[x,y]区间内加上k的操作对差分数组造成的改变只有d[x]和d[y+1] 7 直接用树状数组的基本操作给加上就好了 8 */ 9 #include<iostream> 10 using namespace std; 11 const int N=500009; 12 int d[N]; 13 int c[N]; 14 int n,m; 15 int lowbit(int x) 16 { 17 return x&(-x); 18 } 19 void add(int x,int y)//x位置加上y 20 { 21 d[x]+=y; 22 for(int i=x;i<=n;i+=lowbit(i)) 23 { 24 c[i]+=y; 25 } 26 } 27 void update(int x,int y,int k)//[x,y]区间内加上k 28 { 29 add(x,k); 30 add(y+1,-k); 31 } 32 int ask(int x)//查询a[i]直接d[1]...d[i]的和就是a[i] 33 { 34 int res=0; 35 for(int i=x;i>0;i-=lowbit(i)) 36 { 37 res+=c[i]; 38 } 39 return res; 40 } 41 int main(void) 42 { 43 cin>>n>>m; 44 int t1=0; 45 for(int i=1;i<=n;i++) 46 { 47 int t; 48 cin>>t; 49 d[i]=t-t1;//差分 50 t1=t; 51 add(i,d[i]);//一定要记得构建树状数组 52 }//在差分的基础上构建树状数组 53 for(int i=1;i<=m;i++) 54 { 55 int type; 56 cin>>type; 57 if(type==1)//[x,y]区间内加上k 58 { 59 int x,y,k; 60 cin>>x>>y>>k; 61 update(x,y,k); 62 } 63 else if(type==2)//查询第x个元素 64 { 65 int x; 66 cin>>x; 67 cout<<ask(x)<<endl; 68 69 } 70 } 71 return 0; 72 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端