Cod sursa(job #2386043)

Utilizator andrei32576Andrei Florea andrei32576 Data 22 martie 2019 08:58:07
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <fstream>
using namespace std;

int n, m, i, x, sum, op, a, b;
int v[60005];

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

void add(int nod, int st, int dr, int a, int b)
{
    if (a<=st && dr<=b)
        v[nod] = x;
    else
    {
        int mij = (st+dr)/2;
        if (a <= mij)
            add(2*nod, st, mij, a, b);
        if (b > mij)
            add(2*nod+1, mij+1, dr, a, b);
        v[nod] = v[2*nod] + v[2*nod+1];
    }
}

void update(int nod, int st, int dr, int a, int b)
{
    if (a<=st && dr<=b)
        v[nod] -= x;
    else
    {
        int mij = (st+dr)/2;
        if (a <= mij)
            update(2*nod, st, mij, a, b);
        if (b > mij)
            update(2*nod+1, mij+1, dr, a, b);
        v[nod] = v[2*nod] + v[2*nod+1];
    }
}

void query(int nod, int st, int dr, int a, int b)
{
    if (a<=st && dr<=b)
        sum += v[nod];
    else
    {
        int mij = (st+dr)/2;
        if (a <= mij)
            query(2*nod, st, mij, a, b);
        if (b > mij)
            query(2*nod+1, mij+1, dr, a, b);
    }
}

int main()
{
    f>>n>>m;

    for (i=1;i<=n;i++)
    {
        f>>x;
        add(1, 1, n, i, i);
    }

    for (i=1;i<=m;i++)
    {
        f>>op>>a>>b;
        if (op == 0)
        {
            x = b;
            update(1, 1, n, a, a);
        }
        else
        {
           sum = 0;
           query(1, 1, n, a, b);
           g<<sum<<"\n";
        }
    }

    f.close();
    g.close();
    return 0;
}