70分求调 8-10TLE
查看原帖
70分求调 8-10TLE
283541
harvey2019楼主2022/10/6 22:40
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef float fl;
typedef double dou;
typedef long double ld;
#define register int ri;

const ll inf = 1e9;
const ll inf_common = 0x3f3f3f3f;
const ll inf_larger = 0x7fffffff;
const ll inf_ll = 1e18;
const ll mod = 1e9 + 7;
const ll mod1 = 998244353;
const dou eps = 1e-6;

inline ll read()
{
	ll ans = 0;
	ll f = 1;
	char c = getchar();
	
	while( c < '0' || c > '9' )
	{
		if( c == '-' )
		{
			f = -1;
		}
		
		c = getchar();
	}
	
	while( c >= '0' && c <= '9' )
	{
		ans = ( ans << 3 ) + ( ans << 1 ) + ( c - 48 );
		c = getchar();
	}
	
	return ans * f;
}

inline void write( ll x )
{
	if( x < 0 )
	{
		putchar( '-' );
		x = -x;
	}
	
	if( x > 9 )
	{
		write( x / 10 );
	}
	
	putchar( x % 10 + '0' );
}

int a[1000001] = {0};
int tree[1000001] = {0};

void build_tree( ll node , ll start , ll end )
{
	ll mid = ( start + end ) / 2;
	ll left_node = 2 * node + 1;
	ll right_node = 2 * node + 2;
	
	if( start == end )
	{
		tree[node] = a[start];
			
		return;
	}
	
	build_tree( left_node , start , mid );
	build_tree( right_node , mid + 1 , end );
	
	tree[node] = tree[left_node] + tree[right_node];
}

ll k = 0;

void update_tree( ll node , ll start , ll end , ll l , ll r )
{
	ll mid = ( start + end ) / 2;
	ll left_node = 2 * node + 1;
	ll right_node = 2 * node + 2;
	ll sum_left = 0;
	ll sum_right = 0;
	
	if( r < start || l > end )
	{
		;
	}
	else if( start == end )
	{
		a[start] += k;
		tree[node] += k;
	}
	else
	{
		update_tree( left_node , start , mid , l , r );
		update_tree( right_node , mid + 1 , end , l , r );
		
		tree[node] += k;
	}
}

ll query_tree( ll node , ll start , ll end , ll l , ll r )
{
	ll mid = ( start + end ) / 2;
	ll left_node = 2 * node + 1;
	ll right_node = 2 * node + 2;
	ll sum_left = 0;
	ll sum_right = 0;
	
	if( r < start || l > end )
	{
		return 0;
	}
	else if( start == end )
	{
		return tree[node];
	}
	else
	{
		sum_left = query_tree( left_node , start , mid , l , r );
		sum_right = query_tree( right_node , mid + 1 , end , l , r );
		
		return sum_left + sum_right;
	}
}

int main()
{
//	freopen( "P3372_8.in" , "r" , stdin );
//	freopen( "P3372_8.out" , "w" , stdout );
	 
	ll i = 0; 
	ll n = read();
	ll m = read();
	ll type = 0;
	ll x = 0;
	ll y = 0;
	
	for( i = 0 ; i < n ; i++ )
	{
		a[i] = read();
	}
	
	build_tree( 0 , 0 , n );
	
	while( m-- )
	{
		type = read();
		x = read();
		y = read();
		
		if( type == 1 )
		{
			k = read();
			
			update_tree( 0 , 0 , n , x - 1 , y - 1 );
		}
		else
		{
			write( query_tree( 0 , 0 , n , x - 1 , y - 1 ) );
			putchar( '\n' );
		}
	}
	
	return 0;
}
2022/10/6 22:40
加载中...