#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100005 ;
typedef long long LL;
int n, q;
LL a[ N] ;
LL lazy[ N << 2 ] ;
struct Tree{
int l, r;
LL sum;
int mid ( ) { return ( l + r) >> 1 ; }
} tree[ N<< 2 ] ;
void PushUp ( int rt) {
tree[ rt] . sum = tree[ rt << 1 ] . sum + tree[ rt << 1 | 1 ] . sum;
}
void PushDown ( int rt, int m) {
if ( lazy[ rt] ) {
lazy[ rt << 1 ] + = lazy[ rt] ;
lazy[ rt << 1 | 1 ] + = lazy[ rt] ;
tree[ rt << 1 ] . sum + = lazy[ rt] * ( m - ( m >> 1 ) ) ;
tree[ rt << 1 | 1 ] . sum + = lazy[ rt] * ( m >> 1 ) ;
lazy[ rt] = 0 ;
}
}
void build ( int l, int r, int rt) {
tree[ rt] . l = l;
tree[ rt] . r = r;
lazy[ rt] = 0 ;
if ( l == r) {
tree[ rt] . sum = a[ l] ;
return ;
}
int m = tree[ rt] . mid ( ) ;
build ( l, m, ( rt << 1 ) ) ;
build ( m + 1 , r, ( rt << 1 | 1 ) ) ;
PushUp ( rt) ;
}
void update ( LL c, int l, int r, int rt) {
if ( tree[ rt] . l== l && tree[ rt] . r== r) {
lazy[ rt] + = c;
tree[ rt] . sum + = c* ( r - l + 1 ) ;
return ;
}
if ( tree[ rt] . l == tree[ rt] . r) return ;
int m = tree[ rt] . mid ( ) ;
PushDown ( rt, tree[ rt] . r - tree[ rt] . l + 1 ) ;
if ( r <= m) update ( c, l, r, rt << 1 ) ;
else if ( l > m) update ( c, l, r, rt << 1 | 1 ) ;
else {
update ( c, l, m, rt << 1 ) ;
update ( c, m + 1 , r, rt << 1 | 1 ) ;
}
PushUp ( rt) ;
}
LL Query ( int l, int r, int rt) {
if ( l== tree[ rt] . l && r== tree[ rt] . r) {
return tree[ rt] . sum;
}
int m = tree[ rt] . mid ( ) ;
PushDown ( rt, tree[ rt] . r - tree[ rt] . l + 1 ) ;
LL res = 0 ;
if ( r <= m) res + = Query ( l, r, rt << 1 ) ;
else if ( l > m) res + = Query ( l, r, rt << 1 | 1 ) ;
else {
res + = Query ( l, m, rt << 1 ) ;
res + = Query ( m + 1 , r, rt << 1 | 1 ) ;
}
return res;
}
int main ( ) {
scanf ( "%d%d" , & n, & q) ;
for ( int i = 1 ; i <= n; i++ )
scanf ( "%lld" , a + i) ;
build ( 1 , n, 1 ) ;
char s;
int l, r, c;
while ( q-- ) {
getchar ( ) ;
scanf ( "%c%d%d" , & s, & l, & r) ;
if ( s== 'C' ) {
scanf ( "%d" , & c) ;
update ( c, l, r, 1 ) ;
}
else
printf ( "%lld\n" , Query ( l, r, 1 ) ) ;
}
return 0 ;
}
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1000005 ;
int n, q;
int a[ N] ;
struct node{
int l, r, min, max;
int mid ( ) { return ( l + r) >> 1 ; }
} node[ N<< 2 ] ;
void PushUp ( int i) {
node[ i] . min = min ( node[ i << 1 ] . min, node[ ( i << 1 ) | 1 ] . min) ;
node[ i] . max = max ( node[ i << 1 ] . max, node[ ( i << 1 ) | 1 ] . max) ;
}
void build ( int l, int r, int i) {
node[ i] . l = l; node[ i] . r = r;
if ( l == r) {
node[ i] . max = node[ i] . min = a[ l] ;
return ;
}
int mid = ( l + r) / 2 ;
build ( i << 1 , l, mid) ;
build ( ( i << 1 ) | 1 , mid + 1 , r) ;
PushUp ( i) ;
}
int Min ( int l, int r, int rt) {
if ( l== node[ rt] . l && r== node[ rt] . r)
return node[ rt] . min;
int m = node[ rt] . mid ( ) ;
int res = 0 ;
if ( r <= m) res = Min ( l, r, rt << 1 ) ;
else if ( l > m) res = Min ( l, r, rt << 1 | 1 ) ;
else
res = min ( Min ( l, m, rt << 1 ) , Min ( m + 1 , r, rt << 1 | 1 ) ) ;
return res;
}
int Max ( int l, int r, int rt) {
if ( l== node[ rt] . l && r== node[ rt] . r)
return node[ rt] . max;
int m = node[ rt] . mid ( ) ;
int res = 0 ;
if ( r <= m) res = Max ( l, r, rt << 1 ) ;
else if ( l > m) res = Max ( l, r, rt << 1 | 1 ) ;
else
res = max ( Max ( l, m, rt << 1 ) , Max ( m + 1 , r, rt << 1 | 1 ) ) ;
return res;
}
int main ( ) {
scanf ( "%d%d" , & n, & q) ;
for ( int i = 1 ; i <= n; i++ )
scanf ( "%d" , a + i) ;
build ( 1 , n, 1 ) ;
printf ( "%d" , Min ( 1 , q, 1 ) ) ;
for ( int i = 2 ; i <= n - q + 1 ; i++ )
printf ( " %d" , Min ( i, i + q - 1 , 1 ) ) ;
printf ( "\n%d" , Max ( 1 , q, 1 ) ) ;
for ( int i = 2 ; i <= n - q + 1 ; i++ )
printf ( " %d" , Max ( i, i + q - 1 , 1 ) ) ;
return 0 ;
}