Cod sursa(job #3178463)

Utilizator brianabucur11Briana Bucur brianabucur11 Data 1 decembrie 2023 18:38:53
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int n, m, v[15005], t[100005];

void read ()
{
    fin >> n >> m;
    for (int i=1; i<=n; i++)
        fin >> v[i];
}

void init (int nod, int a, int b)
{
    if (a==b)
    {
        t[nod]=v[a];
        return;
    }
    else
    {
        init(2*nod,a,(a+b)/2);
        init(2*nod+1,(a+b)/2+1,b);
        t[nod]=t[nod*2]+t[nod*2+1];
        return;
    }
}

void update (int nod, int a, int b, int poz, int val)
{
    if (a==b)
    {
        v[poz]-=val;
        t[nod]-=val;
        return;
    }
    else
    {
        int mij=(a+b)/2;
        if (mij<poz)
            update(2*nod+1,mij+1,b,poz,val);
        else
            update(2*nod,a,mij,poz,val);
        t[nod]=t[2*nod]+t[2*nod+1];
        return;
    }
}

int query (int nod, int a, int b, int p, int q)
{
    if (a>=p && b<=q)
        return t[nod];
    else
    {
        int cl=0, cr=0;
        int mij=(a+b)/2;
        if (mij>=p)
            cl=query(2*nod,a,mij,p,q);
        if ((mij+1)<=q)
            cr=query(2*nod+1,mij+1,b,p,q);
        return cl+cr;
    }
}

void solve ()
{
    int x, p, q;
    for (int i=1; i<=m; i++)
    {
        fin >> x >> p >> q;
        if (x==0)
            update(1,1,n,p,q);
        else
            fout << query(1,1,n,p,q) << '\n';
    }
}

int main()
{
    read();
    init(1,1,n);
    solve();
    return 0;
}