Cod sursa(job #2903647)

Utilizator AnaVoineaVoinea Ana Maria AnaVoinea Data 17 mai 2022 19:22:54
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");

int a[4000001];
void creaza_arb (int nod, int l, int r, int poz, int x )
{

    if(poz < l || poz > r) return;
    if(l == r)
    {
        a[nod]=x;
        return;
    }
    int m =(l+r)<<1;
    creaza_arb(2*nod, l, m, poz, x);
    creaza_arb (2*nod+1, m+1, r, poz, x);

    a[nod] = a[2*nod] + a[2*nod+1];
}
int suma(int nod, int l, int r, int st, int dr)
{
    if(st > r || dr < l) return 0;
    if( l >= st && r <= dr) return a[nod];

    int m=(l+r)<<1;
    return suma(2*nod, l, m, st, dr) + suma(2*nod+1, m+1, r, st, dr);
}

void modifica (int nod, int l, int r, int poz, int x )
{

    if(poz < l || poz > r) return;
    if(l == r)
    {
        a[nod]-=x;
        return;
    }
    int m =(l+r)<<1;
    modifica(2*nod, l, m, poz, x);
    modifica(2*nod+1, m+1, r, poz, x);

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

int main()
{
    int n, m;
    f>>n>>m;

    for( int i=1; i<=n; i++)
    {
        int a;
        f>>a;
        creaza_arb(1, 1, n, i, a);
    }

    int ope, a, b;
    for ( int i=1; i<=m; i++)
    {
        f>>ope>>a>>b;
        if(ope==1) {g<<suma(1, 1, n, a, b)<<"\n";}
        else modifica(1, 1, n, a, b);

    }
    return 0;
}