Pagini recente » Clasament leulloe2 | Cod sursa (job #194027) | Cod sursa (job #238547) | Cod sursa (job #3196415) | Cod sursa (job #1285001)
#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);
}