AcWing 243. Un problema entero simple 2 (modificación de intervalo de la matriz de árbol + consulta de intervalo)

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 = 1xj = 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}, 1N ,METRO1 05 ,
∣ d ∣ ≤ 10000 | d | ≤10000d 1 0 0 0 0
∣ A [i] ∣ ≤ 1000000000 | A [i] | ≤1000000000A [ 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;
}

Supongo que te gusta

Origin blog.csdn.net/zzq0523/article/details/113100799
Recomendado
Clasificación