Cod sursa(job #2710259)

Utilizator paulm238Madaras Paul paulm238 Data 22 februarie 2021 11:48:33
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");

int v[300000], u[300000];

void build(int s, int d, int i, int & c)
{
    if(s == d)
    {
        v[i] = u[s];
    }
    else
    {
        int mij = (s + d)/2;
        build(s, mij, i * 2, c);
        build(mij + 1, d, i * 2 + 1, c);
        v[i] = v[i * 2] + v[i * 2 + 1];
    }
    c ++;
}

void upd(int a, int b, int s, int d, int i)
{
    if(s == d)
    {
        v[i] = v[i] - b;
    }
    else
    {
        int mij = (s + d)/ 2;
        if(a <= mij)
            upd(a, b, s, mij, i * 2);
        else
            upd(a, b, mij + 1, d, i * 2 + 1);
        v[i] = v[i * 2] + v[i * 2 + 1];
    }
}

int que(int s, int d, int i, int x, int y)
{
    if(x <= s && y >= d)
        return v[i];
    else
    {
        int ans1 = 0, ans2 = 0;
        int mij = (s + d)/2;
        if(x <= mij)
            ans1 = que(s, mij, i * 2, x, y);
        if(y > mij)
            ans2 = que(mij + 1, d, i * 2 + 1, x, y);
        return ans1 + ans2;
    }
}

int main()
{
    int n, m, c = 0, t, a, b;
    in >> n >> m;
    for(int i = 1; i <= n; i ++)
    {
        in >> u[i];
    }
    build(1, n, 1, c);
    for(int i = 1; i <= m; i ++ )
    {
        in >> t >> a >> b;
        if( t == 1 )
        {
            out << que(1, n, 1, a, b) << '\n';
        }
        else
            upd(a, b, 1, n, 1);
    }
    return 0;
}