Description
这是一道模板题。
给定数列 ,你需要依次进行 个操作,操作有两类:
1 l r x
:给定 ,对于所有 ,将 加上 (换言之,将 分别加上 );2 l r
:给定 ,求 的值(换言之,求 的值)。
Input
第一行包含 个正整数 ,表示数列长度和询问个数。保证 。
第二行 个整数 ,表示初始数列。保证 。
接下来 行,每行一个操作,为以下两种之一:
1 l r x
:对于所有 ,将 加上 ;2 l r
:输出 的值。
保证 。
Output
对于每个 2 l r
操作,输出一行,每行有一个整数,表示所求的结果。
-
Sample Input
5 10 2 6 6 1 1 2 1 4 1 2 5 10 2 1 3 2 2 3 1 2 2 8 1 2 3 7 1 4 4 10 2 1 2 1 4 5 6 2 3 4
-
Sample Output
15 34 32 33 50
#include <bits/stdc++.h>
#define int long long
#pragma GCC optimize(2)
using namespace std;
int a[1000001], n, m;
int sum[4000001];
int lazy[4000001];
inline void write( int x )
{
if( x < 0 )
{
putchar('-');
x = -x;
}
if( x > 9 )
{
write( x / 10 );
}
putchar( x % 10 + '0' );
}
inline long long read()
{
char ch = getchar();
long long r = 0, w = 1;
while( ch < '0' || ch > '9' ) w = ch == '-' ? -1 : w, ch = getchar();
while( ch >= '0' && ch <= '9' ) r = r * 10 + ch - '0', ch = getchar();
return r * w;
}
inline void pushdown( int p, int t )
{
sum[p<<1] += ( t - (t >> 1) ) * lazy[p];
lazy[p<<1] += lazy[p];
sum[p<<1|1] += ( t >> 1 ) * lazy[p];
lazy[p<<1|1] += lazy[p];
lazy[p] = 0;
}
inline void build( int p, int l, int r )
{
if( l == r )
{
sum[p] = a[l];
return ;
}
int mid = ( l + r ) >> 1;
build( p << 1, l, mid );
build( p << 1 | 1, mid + 1, r );
sum[p] = sum[p<<1] + sum[p<<1|1];
}
inline int query( int p, int l, int r, int x, int y )
{
if( x <= l && r <= y )
{
return sum[p];
}
int mid = ( l + r ) >> 1;
int ans = 0;
pushdown( p, r - l + 1 );
if( x <= mid )
{
ans += query( p << 1, l, mid, x, y );
}
if( y > mid )
{
ans += query( p << 1 | 1, mid + 1, r, x, y );
}
return ans;
}
inline void update( int p, int l, int r, int x, int y, int num )
{
if( x <= l && r <= y )
{
sum[p] += ( r - l + 1 ) * num;
lazy[p] += num;
return ;
}
pushdown( p, r - l + 1 );
int mid = ( l + r ) >> 1;
if( x <= mid ) update( p << 1, l, mid, x, y, num );
if( mid < y ) update( p << 1 | 1, mid + 1, r, x, y, num );
sum[p] = sum[p<<1] + sum[p<<1|1];
}
signed main()
{
n = read(), m = read();
for( int i = 1; i <= n; i++ )
{
a[i] = read();
}
build( 1, 1, n );
while( m-- )
{
int op;
op = read();
if( op == 1 )
{
int l, r, x;
l = read(), r = read(), x = read();
update(1, 1, n, l, r, x );
}
else
{
int l, r;
l = read(), r = read();
write( query( 1, 1, n, l, r ) );
putchar( '\n' );
}
}
return 0;
}
标签:10,lazy,ch,数列,int,线段,long,查询,区间
From: https://blog.csdn.net/m0_73232096/article/details/143393244