AcWing243. Un problema de entero simple 2 ( modificación de intervalo de la matriz de árbol + consulta de intervalo )
a 1 + a 2 + a 3 + a… ax a_ {1} + a_ {2} + a_ {3} + a \ dots a_ {x} un1+un2+un3+un...unx = = == == ∑ i = 1 x ∑ j = 1 ibj \ sum ^ {x} _ {i = 1} \ sum ^ {i} _ {j = 1} b_ {j}∑i = 1x∑j = 1yosegundoj
Dada una secuencia A de instrucciones de longitud N y M, cada instrucción puede ser una de las dos siguientes:
1. "C lrd" significa sumar d a todo A [l], A [l + 1], ..., A [r].
2. "Q lr" significa la suma del número l ~ r en la secuencia de consulta.
Para cada consulta, envíe un número entero para indicar la respuesta.
Formato de entrada
Dos números enteros N y M en la primera línea.
N números enteros A [i] en la segunda línea.
Las siguientes líneas M representan instrucciones M, y el formato de cada instrucción se muestra en la descripción del título.
Formato de salida
Para cada consulta, envíe un número entero para indicar la respuesta.
Cada respuesta está en una línea.
rango de datos
1 ≤ N, M ≤ 1 0 5, 1≤N, M≤10 ^ {5}, 1≤N ,METRO≤1 05 ,
∣ d ∣ ≤ 10000 | d | ≤10000∣ d ∣≤1 0 0 0 0
∣ A [i] ∣ ≤ 1000000000 | A [i] | ≤1000000000∣ A [ i ] ∣≤1 0 0 0 0 0 0 0 0 0
Código
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 100010;
int n , m;
int a[N];
LL tr1[N] , tr2[N];
int lowbit(int x)
{
return x & -x;
}
void add(LL tr[] , int x , LL c)
{
for(int i = x ; i <= n ; i += lowbit(i)) tr[i] += c;
}
LL sum(LL tr[] , int x)
{
LL res = 0;
for(int i = x ; i ; i -= lowbit(i)) res += tr[i];
return res;
}
LL prefix_sum(int x)
{
return sum(tr1 , x) * (x + 1) - sum(tr2 , x);
}
int main()
{
scanf("%d%d" , &n , &m);
for(int i = 1; i <= n ; i++) scanf("%d", &a[i]);
for(int i = 1 ; i <= n ; i++)
{
int b = a[i] - a[i - 1];
add(tr1 , i , b);
add(tr2 , i , (LL)b * i);
}
while(m--)
{
int l , r , d;
char op[2];
scanf("%s%d%d" , op , &l , &r);
if(*op == 'Q')
cout << prefix_sum(r) - prefix_sum(l - 1) << endl;
else
{
scanf("%d" , &d);
add(tr1 , l , d) , add(tr1 , r + 1 , -d);
add(tr2 , l , l * d) , add(tr2 , r + 1 , (r + 1) * (- d));
}
}
return 0;
}