函数的参数错了
```cpp
build( 1 , 1 , n ) ;
```
->
```cpp
build( 1 , n , 1 ) ;
```
其他的也错的,慢慢看吧
by lprer @ 2021-07-13 10:29:23
```cpp
#include<bits/stdc++.h>
using namespace std ;
const int N = 1e5 + 10 ;
struct edge
{
int l , r ;
long long sum , add ;
}tree[ N << 2 ] ;
int a[N] , n , m ;
void build( int p , int l , int r )//建树
{
tree[p].l = l , tree[p].r = r ;
if( l == r )
{
tree[p].sum = a[l] ;
return ;
}
int mid = ( l + r ) >> 1 ;
build( p << 1 , l , mid ) ;
build( p << 1 | 1 , mid + 1 , r ) ;
tree[p].sum = tree[ p << 1 ].sum + tree[ p << 1 | 1 ].sum ;
}
void spread ( int p )//打延迟标记
{
if( tree[p].add )
{
tree[ p << 1 ].sum += tree[p].add * ( tree[ p << 1 ].r - tree[ p << 1 ].l + 1 ) ; //更新左子节点
tree[ p << 1 | 1 ].sum += tree[p].add * ( tree[ p << 1 | 1 ].r - tree[ p << 1 | 1 ].l + 1 ) ; //更新右子节点
tree[ p << 1 ].add += tree[p].add ; // 给左子节点打延迟标记
tree[ p << 1 | 1 ].add += tree[p].add ; //给右子节点打延迟标记
tree[p].add = 0 ; //清除p的标记
}
}
void change ( int p , int l , int r , int d ) //修改线段树
{
if( l <= tree[p].l && r >= tree[p].r )
{
tree[p].sum += ( long long )d * ( tree[p].r - tree[p].l + 1 ) ; //更新节点信息
tree[p].add += d ; //给节点打延迟标记
return ;
}
spread( p ) ; //下传延迟标记
int mid = ( tree[p].l + tree[p].r ) >> 1 ;
if( l <= mid )
change( p << 1 , l , r , d ) ;
if( r > mid )
change( p << 1 | 1 , l , r , d ) ;
tree[p].sum = tree[ p<<1 ].sum + tree[ p << 1 | 1 ].sum ;
}
long long ask( int p , int l , int r ) //线段树的区间查询
{
if( l <= tree[p].l && r >= tree[p].r )
return tree[p].sum ;
spread( p ) ; //下传延迟标记
int mid = ( tree[p].l + tree[p].r ) >> 1 ;
long long val = 0 ;
if( l <= mid )
val += ask ( p << 1 , l , r ) ;
if( r > mid )
val += ask ( p << 1 | 1 , l , r ) ;
return val ;
}
int main(){
cin >> n >> m ;
for(int i = 1 ; i <= n ; i++)
cin >> a[i] ;
build( 1 , 1 , n ) ;
for(int i = 1 ; i <= m ; i++)
{
int q , x , y , z ;
cin >> q ;
if( q == 1 )
{
cin >> x >> y >> z;
change( 1 , x , y , z ) ;
}
else
{
cin >> x >> y ;
cout << ask( 1 , x , y ) << endl ;
}
}
return 0;
}
```
☺
by qnqfff @ 2021-07-13 10:42:05