Cod sursa(job #3253738)

Utilizator Laura139Anghel Laura Laura139 Data 4 noiembrie 2024 17:01:44
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>
#include <cmath>

using namespace std;

ifstream cin("datorii.in");
ofstream cout("datorii.out");

int n,m;

int a[32770];
int v[15005];

void initializare(int nod, int st, int dr)
{
    if(st==dr)
    {
        if(st<=n)
            a[nod]=v[st];
        return;
    }
    int med=(st+dr)/2;
    initializare(2*nod, st, med);
    initializare(2*nod+1, med+1, dr);
    a[nod]=a[2*nod] + a[2*nod+1];
}

void update(int nod, int st, int dr, int poz, int val)
{
    if(st==dr)
    {
        a[nod]-=val;
        return;
    }
    int med=(st+dr)/2;
    if(poz<=med)
        update(2*nod, st, med, poz, val);
    else
        update(2*nod+1, med+1, dr, poz, val);
    a[nod]=a[2*nod]+a[2*nod+1];
}

int query(int nod, int st, int dr, int qst, int qdr)
{
    if(st>=qst && dr<=qdr)
        return a[nod];
    int med=(st+dr)/2, sum=0;
    if(qst<=med)
        sum += query(2*nod, st, med, qst, qdr);
    if(qdr>med)
        sum += query(2*nod+1, med+1, dr, qst, qdr);
    return sum;
}

int main()
{
    int q;
    cin>>n>>q;
    m=pow(2, floor(log2(n)+!(log2(n)==floor(log2(n)))));
    for(int i=1;i<=n;i++)
        cin>>v[i];
    initializare(1,1,m);
    for(int i=1;i<=q;i++)
    {
        int x,y,c;
        cin>>c>>x>>y;
        if(c==0)
        {
            update(1,1,m,x,y);
        }
        else
        {
            cout<<query(1,1,m,x,y)<<'\n';
        }
    }
    return 0;
}