Cod sursa(job #1285001)

Utilizator AdrianaMAdriana Moisil AdrianaM Data 7 decembrie 2014 00:29:54
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream is("datorii.in");
ofstream os("datorii.out");

int n, m;
int x, y, z;
int val, poz, semn;
int answ, leftt, rightt;
vector<int> arb;

void UPDATE(int nod, int st, int dr);
void QUERRY(int nod, int st, int dr);

int main()
{
    is >> n >> m;
    arb.resize(4 * n);
    semn = 1;
    for ( int i = 1; i <= n; ++i )
    {
        is >> x;
        val = x;
        poz = i;
        UPDATE(1, 1, n);
    }
    semn = -1;
    while ( m-- )
    {
        is >> x >> y >> z;
        if ( !x )
        {
            poz = y;
            val = z;
            UPDATE(1, 1, n);
        }
        else
        {
            leftt = y;
            rightt = z;
            answ = 0;
            QUERRY(1, 1, n);
            os << answ << "\n";
        }
    }
    is.close();
    os.close();
    return 0;
}

void UPDATE(int nod, int st, int dr)
{
    if ( st == dr )
    {
        arb[nod] += semn * val;
        return;
    }
    int md = ( st + dr ) / 2;
    if ( poz <= md )
        UPDATE(2 * nod, st, md);
    else
        UPDATE(2 * nod + 1, md + 1, dr);
    arb[nod] = arb[2 * nod] + arb[2 * nod + 1];
}

void QUERRY(int nod, int st, int dr)
{
    if ( leftt <= st && dr <= rightt )
    {
        answ += arb[nod];
        return;
    }
    int md = ( st + dr ) / 2;
    if ( leftt <= md )
        QUERRY(2 * nod, st, md);
    if ( md < rightt )
        QUERRY(2 * nod + 1, md + 1, dr);
}