Cod sursa(job #2442794)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 25 iulie 2019 12:38:12
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>

using namespace std;

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

const int NMAX = 15e3 + 5;

int N, M, A[NMAX], V[4 * NMAX], dp[NMAX];

int Type, X, Y;

inline void Update (int Node, int a, int b, int pos, int val)
{
    if(a == b)
    {
        V[Node] += val;

        return;
    }

    int Mid = (a + b) / 2;

    if(pos <= Mid)
        Update(2 * Node, a, Mid, pos, val);

    if(pos > Mid)
        Update(2 * Node + 1, Mid + 1, b, pos, val);

    V[Node] = V[2 * Node] + V[2 * Node + 1];

    return;
}

inline int Query (int Node, int a, int b, int qa, int qb)
{
    if(qa <= a && b <= qb)
        return V[Node];

    int Mid = (a + b) / 2;

    int p1 = 0, p2 = 0;

    if(qa <= Mid)
        p1 = Query(2 * Node, a, Mid, qa, qb);

    if(qb > Mid)
        p2 = Query(2 * Node + 1, Mid + 1, b, qa, qb);

    return (p1 + p2);
}

inline void Read ()
{
    f.tie(NULL);

    f >> N >> M;

    for(int i = 1; i <= N; ++i)
        f >> A[i];

    return;
}

inline void Upload ()
{
    for(int i = 1; i <= N; ++i)
        dp[i] = dp[i - 1] + A[i];

    return;
}

inline void Solve ()
{
    while(M--)
    {
        f >> Type >> X >> Y;

        if(Type == 0)
            Update(1, 1, N, X, Y);
        else
            g << ((dp[Y] - dp[X - 1]) - Query(1, 1, N, X, Y)) << '\n';
    }

    return;
}

int main()
{
    Read();

    Upload();

    Solve();

    return 0;
}