Cod sursa(job #2803712)

Utilizator alexdmnDamian Alexandru alexdmn Data 20 noiembrie 2021 12:59:45
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <fstream>

using namespace std;
int aint[500005], n, p = 1;
void up ( int i, int val )
{
    int poz = p - 1 + i;
    aint[poz] -= val;

    while ( poz > 1 )
    {
        poz /= 2;
        aint[poz] = aint[poz * 2] + aint[poz * 2 + 1];
    }
}
int query ( int ind, int csta, int cdra, int cstq, int cdrq )
{
    if ( cstq <= csta && cdra <= cdrq )
        return aint[ind];
    else
    {
        int aux = 0;

        if ( cstq <= ( csta + cdra ) / 2 )
            aux += query ( ind * 2, csta, ( csta + cdra ) / 2, cstq, cdrq );

        if ( cdrq > ( csta + cdra ) / 2 )
            aux += query ( ind * 2 + 1, ( csta + cdra ) / 2 + 1, cdra, cstq, cdrq );

        return aux;
    }
}
int main()
{
    ifstream cin ( "datorii.in" );
    ofstream cout ( "datorii.out" );

    int m, c, a, b, aux,t;
	cin >> n >> m;

	p = 1;
	while ( p < n )
		p *= 2;

	for ( int i = p; i <= p + n - 1; i++ )
	{
		cin >> aint[i];
	}
	for ( int i = p + n; i <= p * 2; i++ )
	{
		aint[i] = 0;
	}

	for ( int i = p - 1; i >= 1; i-- )
	{
		aint[i] = aint[i * 2] + aint[i * 2 + 1];
	}

	for ( int i = 0; i < m; i++ )
	{
		cin >> c >> a >> b;

		if ( c == 1 )
			cout << query ( 1, 1, p, a, b ) << '\n';
		else
		{
			up ( a, b );
		}
	}

    return 0;
}