萌新刚学JAVA,球球了救救孩子吧
import java.util.Scanner;
public class Main {
static int n , m;
static long A[] = new long[100005];
static Tree T = new Tree();
static void Build ( int root , int start , int end ) {
T.siz[root] = end - start + 1;
T.lazytag[root] = 0;
if ( start == end ) {
T.val[root] = A[start];
return;
}
int mid = ( start + end ) / 2;
Build ( root * 2 , start , mid );
Build ( root * 2 + 1 , mid + 1 , end );
T.val[root] = T.val[root * 2] + T.val[root * 2 + 1];
return;
}
public static void main(String[] args) {
Scanner scan = new Scanner ( System.in );
n = scan.nextInt();
m = scan.nextInt();
for ( int i = 1 ; i <= n ; i++ ) {
A[i] = scan.nextInt();
// System.out.print(A[i] );
// System.out.print(' ');
}
Build ( 1 , 1 , n );
// System.out.println(T.val[1]);
for ( int t = 1 ; t <= m ; t++ ) {
int opts = scan.nextInt();
if ( opts == 1 ) {
int l , r , k;
l = scan.nextInt();
r = scan.nextInt();
k = scan.nextInt();
T.update ( 1 , 1 , n , l , r , k );
}
else if ( opts == 2 ) {
int l , r;
l = scan.nextInt();
r = scan.nextInt();
long ans = T.query( 1 , 1 , n , l , r );
System.out.println(ans);
}
}
scan.close();
}
}
class Tree {
long lazytag[] = new long[100005];
long val[] = new long[100005];
int siz[] = new int[100005];
void pushdown ( int root ) {
if ( lazytag[root] != 0 ) {
val[root * 2 + 1] = ( val[root * 2 + 1] + lazytag[root] * siz[root * 2 + 1] );
val[root * 2] = ( val[root * 2] + lazytag[root] * siz[root * 2] );
lazytag[root * 2] += lazytag[root];
lazytag[root * 2 + 1] += lazytag[root];
lazytag[root] = 0;
}
return;
}
void update ( int root , int nstart , int nend , int qstart , int qend , int add ) {
if ( qstart > nend || qend < nstart )
return;
if ( qstart <= nstart && qend >= nend ) {
lazytag[root] += add;
val[root] += add * siz[root];
return;
}
pushdown ( root );
int mid = ( nstart + nend ) / 2;
update ( root * 2 , nstart , mid , qstart , qend , add );
update ( root * 2 + 1 , mid + 1 , nend , qstart , qend , add );
val[root] = val[root * 2] + val[root * 2 + 1];
return;
}
long query ( int root , int nstart , int nend , int qstart , int qend ) {
if ( nstart > qend || nend < qstart )
return 0;
if ( nstart >= qstart && nend <= qend )
return val[root];
int mid = ( nstart + nend ) >> 1;
pushdown ( root );
return query ( root * 2 , nstart , mid , qstart , qend ) + query ( root * 2 + 1 , mid + 1 , nend , qstart , qend );
}
}