Cod sursa(job #2815758)

Utilizator bogikanagyNagy Boglarka bogikanagy Data 10 decembrie 2021 11:05:21
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
//#include <iostream>
#include <fstream>
#include <vector>
#define ll long long

using namespace std;

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

ll n,m,i,j,a,b,c;
vector <ll> x,y;

ll construct (ll f, ll l, ll root)
{
    if (f==l)
    {
        x[root]=y[f];
        return y[f];
    }

    ll middle=(f+l)/2;
    x[root]=construct(f,middle,2*root)+construct(middle+1,l,2*root+1);
    return x[root];
}

ll change (ll f,ll l, ll root, ll pos)
{
    if (f==l)
    {
        ll r=x[root];
        x[root]=y[pos];
        return x[root]-r;
    }

    ll middle=(f+l)/2;
    if (middle>=pos)
    {
        ll k=change(f,middle,2*root,pos);
        x[root]+=k;
        return k;
    }
    else
    {
        ll k=change(middle+1,l,2*root+1,pos);
        x[root]+=k;
        return k;
    }
}

ll query (ll f, ll l, ll a, ll b, ll root)
{
    if (a<=f&&l<=b)
    {
        return x[root];
    }

    if (b<f||l<a) return 0;

    ll middle=(f+l)/2;
    return query(f,middle,a,b,2*root)+query(middle+1,l,a,b,2*root+1);
}
int main()
{
    cin>>n>>m;
    x.resize(4*n+66);
    y.reserve(n+1);
    for (i=1;i<=n;++i)
    {
        cin>>y[i];
    }

    construct(1,n,1);
    for (i=1;i<=m;++i)
    {
        cin>>a>>b>>c;
        if (a==1)
        {
            cout<<query(1,n,b,c,1)<<"\n";
        }
        else
        {
            y[b]-=c;
            change(1,n,1,b);
        }
    }
    return 0;
}