Cod sursa(job #3322973)

Utilizator Andrei1209Andrei Mircea Andrei1209 Data 16 noiembrie 2025 13:41:56
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>

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

const int Nmax = 1e5 + 5;
int aint[4 * Nmax], v[Nmax];
void build( int nod, int st, int dr )
{
    if ( st == dr )
    {
        aint[nod] = v[st];
        return ;
    }
    int mij = (st + dr) / 2;
    build(2 * nod, st, mij);
    build(2 * nod + 1, mij + 1, dr);
    aint[nod] = aint[2 * nod] + aint[2 * nod + 1];
    //fout << "st = " << st << " dr = " << dr << " nod = " << nod << " aint = " << aint[nod] << endl;
}
void update( int nod, int st, int dr, int poz)
{
    if ( st == dr )
    {
        aint[nod] = v[st];
        return ;
    }

    int mij = (st + dr) / 2;
    if ( poz <= mij )
        update( nod * 2, st, mij, poz);
    else
        update(nod * 2 + 1, mij + 1, dr, poz);
    aint[nod] = aint[2 * nod] + aint[2 * nod + 1];
}
int querry( int nod, int st, int dr, int qst, int qdr )
{
    if ( qst <= st && qdr >= dr )
        return aint[nod];
    int mij = (st + dr) / 2, ans = 0;
    if ( qst <= mij )
        ans = querry( nod * 2, st, mij, qst, qdr);
    if ( qdr > mij )
        ans = ans + querry(nod * 2 + 1, mij + 1, dr, qst, qdr);
    return ans;
}
int main()
{
    int n, m, i;
    fin >> n >> m;
    for ( i = 1; i <= n; ++i )
        fin >> v[i];

    build(1, 1, n);
    for ( i = 1; i <= m; ++i )
    {
        int a, b, tip;
        fin >> tip >> a >> b;
        if ( tip == 1 )
            fout << querry(1, 1, n, a, b) << '\n';
        else
        {
            v[a] -= b;
            update(1, 1, n, a);
        }
    }
    return 0;
}