- 分享
20241124线段树基础
- 2024-11-24 21:14:02 @
/*
10 7
12 58 98 2 17 81 88 15 58 88
1 8
2 8 100
1 8
3 1 10
3 5 8
4 5 8 1000
3 5 8
*/
#include<iostream>
using namespace std;
struct Node{
int l,r,w,f;
}tr[400100];
int n,m;
void down(int k){
tr[2*k].f+=tr[k].f;
tr[2*k+1].f+=tr[k].f;
tr[2*k].w+=tr[k].f*(tr[2*k].r-tr[2*k].l+1);
tr[2*k+1].w+=tr[k].f*(tr[2*k+1].r-tr[2*k+1].l+1);
tr[k].f=0;
}
void build(int k,int ll,int rr){
int mid;
tr[k].l=ll;
tr[k].r=rr;
if(tr[k].l==tr[k].r){
cin>>tr[k].w;
return;
}
mid=(tr[k].l+tr[k].r)/2;
build(2*k,ll,mid);
build(2*k+1,mid+1,rr);
tr[k].w=tr[2*k].w+tr[2*k+1].w;
}
int ap(int k,int x){
if(tr[k].l==tr[k].r){
return tr[k].w;
}
if( tr[k].f>0 ){down(k);}
int mid=(tr[k].l+tr[k].r)/2;
if( x<=mid ){return ap( 2*k, x );}
else{ return ap(2*k+1,x);}
}
void cp(int k,int x,int add){
if(tr[k].l==tr[k].r){
tr[k].w+=add;
return;
}
if( tr[k].f>0 ){down(k);}
int mid=(tr[k].l+tr[k].r)/2;
if( x<=mid ){cp(2*k,x,add);}
else{ cp(2*k+1,x,add);}
tr[k].w=tr[2*k].w+tr[2*k+1].w;
}
int ai(int k,int x,int y){
int ans=0;
if(x<=tr[k].l && y>=tr[k].r ){
return tr[k].w;
}
if( tr[k].f>0 ){down(k);}
int mid=(tr[k].l+tr[k].r)/2;
if(x<=mid){ ans+=ai( 2*k,x,y ); }
if(y>mid){ ans+=ai( 2*k+1,x,y ); }
return ans;
}
void ci(int k,int x,int y,int add){
if(x<=tr[k].l && y>=tr[k].r ){
tr[k].w+=add*(tr[k].r-tr[k].l+1 );
tr[k].f+=add;
return;
}
if( tr[k].f>0 ){down(k);}
int mid=(tr[k].l+tr[k].r)/2;
if(x<=mid){ ci( 2*k,x,y,add ); }
if(y>mid){ ci( 2*k+1,x,y,add ); }
tr[k].w=tr[2*k].w+tr[2*k+1].w;
}
int main(){
int ml,cs1,cs2,cs3,cs4;
cin>>n>>m;
build(1,1,n);
for(int i=1;i<=m;i++){
cin>>ml;
if(ml==1){cin>>cs1;cout<<ap(1,cs1)<<"\n";}
if(ml==2){cin>>cs1>>cs2;cp(1,cs1,cs2);}
if(ml==3){cin>>cs1>>cs2;cout<<ai(1,cs1,cs2)<<"\n";}
if(ml==4){cin>>cs1>>cs2>>cs3;ci(1,cs1,cs2,cs3);}
}
return 0;
}
0 条评论
目前还没有评论...