Cod sursa(job #1511544)

Utilizator DoraBenzoVelicu Teodora DoraBenzo Data 26 octombrie 2015 21:05:50
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <iostream>
#include <fstream>
#define nrmax 15001

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

int n, m, arb[3*nrmax], x, y, cond, s;

void update(int p, int st, int dr)
{
    if(st == dr)
    {
        arb[p] = y;
        return;
    }
    int mj = (st + dr) / 2;
    if(x <= mj)
        update(p*2, st, mj);
    else
        update(p*2+1, mj+1, dr);
    arb[p] = arb[2*p] + arb[2*p+1];
}

void update_zi(int p, int st, int dr)
{
    if(st == dr)
    {
        arb[p] = arb[p] - y;
        return;
    }
    int mj = (st + dr)/2;
    if(x <= mj)
        update_zi(p*2, st, mj);
    else
        update_zi(p*2+1, mj+1, dr);
    arb[p] = arb[p*2] + arb[p*2+1];
}

void query( int p, int st, int dr)
{
    if(x <= st && dr <= y)
    {
        s += arb[p];
        return;
    }
    int mij = (st + dr) / 2;
    if(x <= mij)
        query(2*p, st, mij);
    if(y > mij)
        query(2*p+1, mij+1, dr);
}

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

    for(x=1; x<=n; x++)
    {
        fin >> y;
        update(1, 1, n);
    }

    for(int i=1; i<=m; i++)
    {
        fin >> cond >> x>> y;
        if(cond == 0)
            update_zi(1, 1, n);
        else
        {
            s = 0;
            query(1, 1, n);
            fout<<s<<"\n";
        }
    }

    return 0;
}