re求助
查看原帖
re求助
503129
sine1111楼主2021/7/13 10:12
#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 l , int r , int p )//建树 
{
	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 l , int r , int p , 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 l , int r , int p ) //线段树的区间查询 
{
	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;
}
2021/7/13 10:12
加载中...