Cod sursa(job #2754979)

Utilizator vlad_dimaVlad Dima vlad_dima Data 26 mai 2021 18:29:25
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <bits/stdc++.h>

using namespace std;


ifstream f("datorii.in");
ofstream o("datorii.out");

int n, m, x;
int arb[400001];


void construireSume(int lim_st, int lim_dr, int nod, int suma, int zi)
{
    if (lim_st == lim_dr)
        arb[nod] = suma;
    else
    {
        int lim_m = (lim_st+lim_dr)/2;

        if (zi <= lim_m)
            construireSume(lim_st,lim_m,nod*2,suma,zi);
        else
            construireSume(lim_m+1,lim_dr,nod*2+1,suma,zi);

        arb[nod] = arb[nod*2] + arb[nod*2+1];
    }
}


void schimbareSume(int lim_st, int lim_dr, int nod, int suma, int zi)
{
    if (lim_st == lim_dr)
        if (arb[nod] - suma < 0)
            arb[nod] = 0;
        else
            arb[nod] -= suma;
    else
    {
        int lim_m = (lim_st+lim_dr)/2;

        if (zi <= lim_m)
            schimbareSume(lim_st,lim_m,nod*2,suma,zi);
        else
            schimbareSume(lim_m+1,lim_dr,nod*2+1,suma,zi);

        arb[nod] = arb[nod*2] + arb[nod*2+1];
    }
}

int sume(int lim_st,int lim_dr, int nod, int a, int b)
{

    if (a <= lim_st && lim_dr <= b)
        return arb[nod];

    int suma = 0;
    int lim_m = (lim_st+lim_dr)/2;

    if (a <= lim_m)
        suma += sume(lim_st,lim_m,nod*2,a,b);
    if (b > lim_m)
        suma += sume(lim_m+1,lim_dr,nod*2+1,a,b);

    return suma;

}

int main()
{
    f>>n>>m;
    for (int i = 1; i <= n; i++)
    {
        f>>x;
        construireSume(1,n,1,x,i);
    }
    for (int i = 0; i < m; i++)
    {
        int com, a, b;
        f>>com>>a>>b;

        if (!com)
        {
            schimbareSume(1,n,1,b,a);
        }
        else
        {
            o<<sume(1,n,1,a,b)<<'\n';
        }
    }

}