Pagini recente » Cod sursa (job #2899538) | Cod sursa (job #3154958) | Cod sursa (job #858708) | Cod sursa (job #2515063) | Cod sursa (job #2902798)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
struct Nod {
int val;
Nod *st, *dr;
};
int v[100000], n, m;
Nod* build( int st, int dr )
{
Nod *nou = new Nod;
if( st == dr )
{
nou->val = v[st];
nou->st = NULL;
nou->dr = NULL;
return nou;
}
nou->st = build( st, ( st + dr ) / 2 );
nou->dr = build( ( st + dr ) / 2 + 1, dr );
nou->val = nou->st->val + nou->dr->val;
return nou;
}
/*
void afisareRSD( Nod* n )
{
if( n != NULL )
{
cout << n->val << " ";
afisareRSD( n->st );
afisareRSD( n->dr );
}
}
*/
int interogare( Nod* nod, int st, int dr, int a, int b )
{
if( a <= st && dr <= b )
return nod->val;
int maxSt = 0, maxDr = 0;
int mij = ( st + dr ) / 2;
if( a <= mij )
maxSt = interogare( nod->st, st, mij, a, b );
if( b > mij )
maxDr = interogare( nod->dr, mij + 1, dr, a, b );
return maxSt + maxDr;
}
void actualizare( Nod* nod, int st, int dr, int poz )
{
if( st == dr )
{
nod->val = v[st];
return;
}
int mij = ( st + dr ) / 2;
if( st <= poz && poz <= mij )
actualizare( nod->st, st, mij, poz );
if( mij + 1 <= poz && poz <= dr )
actualizare( nod->dr, mij + 1, dr, poz );
nod->val = nod->st->val + nod->dr->val;
}
int main()
{
f >> n >> m;
for( int i = 0; i < n; ++i )
f >> v[i];
Nod *rad = build( 0, n - 1 );
for( int i = 0; i < m; ++i )
{
int x, a, b;
f >> x >> a >> b;
if( x == 1 )
g << interogare( rad, 0, n - 1, a - 1, b - 1 ) << "\n";
else
{
v[a - 1] -= b;
actualizare( rad, 0, n - 1, a - 1 );
}
}
f.close();
g.close();
return 0;
}