Cod sursa(job #3000757)

Utilizator TanasaStefanTanasa Stefan TanasaStefan Data 12 martie 2023 20:15:45
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>

using namespace std;

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

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

void buildtree(int nod , int left , int right)
{
    if(left == right)
    {
        arbore[nod] = v[left];
        return ;
    }

    int mid = (left + right) / 2;

    buildtree(2 * nod , left , mid);
    buildtree(2 * nod + 1 , mid + 1 , right);

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

void update(int nod , int left , int right ,int pos , int val)
{
    if( left == right)
    {
        arbore[nod] = v[left];
        return ;
    }

    int mid = (left + right) / 2;

    if(pos <= mid)
        update( 2 * nod , left , mid , pos , val);
    else
        update(2 * nod + 1 , mid + 1 , right , pos , val);

    arbore[nod] = arbore[2 * nod] + arbore[2 * nod + 1];
}
int querry(int nod , int left , int right , int qleft , int qright)
{
    if(left >= qleft && right <= qright)
    {
        return arbore[nod];
    }

    int mid = (left + right) / 2;

    int s = 0;

    if(qleft <= mid && qright > mid)
        return querry(2 * nod , left , mid , qleft , qright) + querry(2 * nod + 1 , mid + 1 , right , qleft , qright);
    if(qleft <= mid)
        return querry(2 * nod , left , mid , qleft , qright);
    else
        return  querry(2 * nod + 1 , mid + 1 , right , qleft , qright);
}
int main()
{
    f >> n >> m;

    for (int i = 1 ; i <= n ; i++)
    {
        f >> v[i];
    }

    buildtree(1 , 1 , n);

    for(int i = 1 ; i <= m ; i++)
    {
        int cer , x , y;
        f >> cer >> x >> y;
        if(cer == 0)
            {
                v[x] = v[x] - y;
                update(1 , 1 , n , x , y);
            }
        else
        {
            g << querry ( 1 , 1 , n , x , y) << '\n';
        }
    }
}