//线段树模板
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100005
int ans=0; //用于单点查询输出答案
int x; //单点查询的点
int y; //单点查询修改的值
int c; //区间修改的值
struct node{
int l,r,w; //左右儿子,值
// int f; //懒标记
}tree[4*MAXN+1];
//void down(int k){ //懒标记下传
// tree[k*2].f+=tree[k].f;
// tree[k*2+1].f+=tree[k].f;
// tree[k*2].w+=tree[k].f*(tree[2*k].r-tree[2*k].l+1);
// tree[k*2+1].w+=tree[k].f*(tree[2*k+1].r-tree[2*k+1].l+1);
// tree[k].f=0;
//}
void build(int l,int r,int k){ //建树
if(l==r){
scanf("%d",&tree[k].w);
// tree[k].f=0; //懒标记
return ;
}
tree[k].l=l,tree[k].r=r;
int m=(l+r)/2;
build(l,m,2*k);
build(m+1,r,2*k+1);
tree[k].w=tree[2*k].w+tree[2*k+1].w;
}
void ask(int k){ //单点查询
if(tree[k].l==tree[k].r){
ans=tree[k].w;
return ;
}
// if(tree[k].f!=0) down(k); //懒标记下传
int m=(tree[k].l+tree[k].r)/2;
if(x<=m) ask(k*2);
else ask(k*2+1);
}
void add(int k){ //单点修改
if(tree[k].l==tree[k].r){
tree[k].w=y;
return ;
}
// if(tree[k].f!=0) down(k); //懒标记下传
int m=(tree[k].l+tree[k].r)/2;
if(x<=m) add(k*2);
else add(k*2+1);
tree[k].w=tree[k*2].w+tree[k*2+1].w;
//更新修改之后线段树所有的点
}
void sum(int k){ //区间查询,x,y为区间
if(tree[k].l>=x&&tree[k].r<=y){
ans+=tree[k].w;
return ;
}
// if(tree[k].f!=0) down(k); //懒标记下传
int m=(tree[k].l+tree[k].r)/2;
if(x<=m) sum(2*k);
if(y>m) sum(2*k+1); //两个都是if
}
//void change(int k){ //区间修改
// if(tree[k].l>=x&&tree[k].r<=y){
// tree[k].w+=(tree[k].r-tree[k].l+1)*c;
// tree[k].f+=c;
// return ;
// }
// if(tree[k].f!=0) down(k);
// int m=(tree[k].l+tree[k].r)/2;
// if(x<=m) change(k*2);
// if(y>m) change(k*2+1);
// tree[k].w=tree[k*2].w+tree[k*2+1].w;
//}
int main(){
int n;
printf("输入节点个数\n");
scanf("%d",&n); //节点个数
printf("依次输入每个点\n");
build(1,n,1); //建树
int l;
printf("单点查询1,单点修改2,区间查询3,区间修改4,结束5\n");
while(1){
ans=0,x=0,y=0,c=0;
scanf("%d",&l);
if(l==1){
scanf("%d",&x);
ask(1);
printf("ans=%d\n",ans); //输出第q1个数
}else if(l==2){
scanf("%d %d",&x,&y);
add(1);
}else if(l==3){
scanf("%d %d",&x,&y);
sum(1);
printf("ans=%d\n",ans);
// }else if(l==4){
// scanf("%d %d %d",&x,&y,&c);
// change(1);
}else{
break;
}
}
return 0;
}
线段树模板
最新推荐文章于 2024-03-01 00:18:20 发布