Cod sursa(job #3168346)

Utilizator NiffSniffCojocaru Calin Marcu NiffSniff Data 12 noiembrie 2023 02:08:55
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
using namespace std;
string file = "datorii";
ifstream cin (file + ".in");
ofstream cout (file + ".out");
int aint[300000], v[15000];

void prelucrare(int p,int st, int dr)
{
    if (st==dr)
    {
        aint[p] = v[st];

    }
    else
    {
        int m = (st+dr)/2, fs = p*2+1, fd = p*2+2;
        prelucrare(fs,st,m);
        prelucrare(fd,m+1,dr);
        aint[p] = aint[fs] + aint[fd];
    }
}

void modificare(int p, int st, int dr, int poz, int val)
{
    aint[p] -= val;
    if (st != dr)
    {
        int m = (st+dr)/2, fs = p*2+1, fd = p*2+2;
        if (poz <= m)
        {
            modificare(fs,st,m,poz,val);
        }
        else
        {
            modificare(fd,m+1,dr,poz,val);
        }
    }
}
int interogare(int p, int st, int dr, int a, int b)
{
    int c = 0;
    if (a <= st && dr <= b)
    {
        c = aint[p];
    }
    else
    {
        int fs = p*2+1, fd = p*2+2, m = (st+dr)/2;
        if (a <= m)
        {
            c += interogare(fs,st,m,a,b);
        }
        if (b >= m+1)
        {
            c += interogare(fd,m+1,dr,a,b);
        }
    }
    return c;
}


int main ()
{
    int m,x,y,n;
    bool op;
    cin >> n >> m;
    for (int i=0; i<n; i++)
        cin >> v[i];
    prelucrare(0,0,n-1);
    while (m--)
    {
        cin >> op >> x >> y;
        if (op)
        {
            cout << interogare(0,0,n-1,x-1,y-1) << '\n';
        }
        else
        {
            modificare(0,0,n-1,x-1,y);
        }
    }
}