Cod sursa(job #2386570)

Utilizator Mirela_MagdalenaCatrina Mirela Mirela_Magdalena Data 23 martie 2019 11:23:25
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <cstdio>
#include <cmath>
using namespace std;

int n, m, k;
int arb[32000];
int a, b, T;
void constr(int st, int dr, int poz)
{
    if(st == dr)
    {
        //arb[poz/2] += arb[poz];
        return;
    }
    int mij = (st + dr)/2;
    constr(st, mij, poz * 2);
    constr(mij+1, dr, poz * 2 + 1);
    arb[poz] = arb[poz*2] + arb[poz*2+1];
}

void cera(int V, int poz)
{
    int pozaux = poz + k - 1;
    while(pozaux != 0)
    {
        arb[pozaux] -= V;
        pozaux /= 2;
    }
}

/// a    st dr   b
int cerb(int st, int dr, int poz)
{
    if(dr < a || st > b)
        return 0;
    if(a <= st && dr <= b)
        return arb[poz];
    int mij = (st + dr)/2;
    int pst = cerb(st, mij, poz*2);
    int pdr = cerb(mij+1, dr, poz*2 + 1);
    return pst + pdr;
}



int main()
{
    freopen("datorii.in", "r", stdin);
    freopen("datorii.out", "w", stdout);
    scanf("%d %d", &n, &m);
    k = pow(2, ceil(log2(n)));
    for(int i=1; i<=n; i++)
        scanf("%d", &arb[i+k-1]);
    constr(1, k, 1);
    for(int i=1; i<=m; i++)
    {
        scanf("%d %d %d", &T, &a, &b);
        if(T == 0) /// scade val a, de pe poz b
            cera(b, a);
        else printf("%d\n", cerb(1, k, 1)); /// face suma de la a-b
    }
    return 0;
}