Cod sursa(job #2101251)

Utilizator nic_irinaChitu Irina nic_irina Data 7 ianuarie 2018 00:34:03
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream fin("datorii.in");
ofstream fout("datorii.out");

int v[100001], suma[400004];

int create(int nod, int l, int r)
{
    if(r==l) //dc suntem in frunza
    {
        suma[nod] = v[l];
        return v[l];
    }
    //else -> dc suntem in nod interior
    int mid = (l+r)/2;  //in caz de overflow: l+(r-l)2;
    int val1 = create(2*nod, l, mid);
    int val2 = create(2*nod+1, mid+1, r);
    suma[nod] = val1+val2;
    return suma[nod];
}

void update(int nod, int l, int r, int ind, int val)
{
    if(r==l)
    {
        v[l] -= val;
        suma[nod] -= val ;
    }
    else
    {
        int mid = l+(r-l)/2;
        if(ind <= mid)
            update(2*nod, l, mid, ind, val);
        else
            update(2*nod+1, mid+1, r, ind, val);
        suma[nod] = suma[2*nod] + suma[2*nod +1];
    }

}

int query(int nod, int l, int r, int st, int dr)
//l, r capetele intervalului de care este raspunzator nodul
//st, dr capetele intervalului din cerinta
{
    if(l>=st && r<=dr)
        return suma[nod];
    else
        if(r<st || l>dr)
            return 0;
        //else

    int mid = (l+r)/2;
    int val1 = query(2*nod, l, mid, st, dr);
    int val2 = query(2*nod +1, mid+1, r, st, dr);
    return val1+val2;
}

int main()
{
    int n, m, cod, p, q, i;
    fin>>n>>m;
    for(i=1; i<=n; i++)
        fin>>v[i];
    create(1, 1, n);
    for(i=1; i<=m; i++)
    {
        fin>>cod>>p>>q;
        if(cod==1)
            fout<<query(1, 1, n, p, q)<<'\n';
        else
            update(1, 1, n, p, q);
    }
}