Pagini recente » Cod sursa (job #443439) | Cod sursa (job #761896) | Cod sursa (job #633854) | Cod sursa (job #2098882) | Cod sursa (job #3004577)
#include <fstream>
#define dim 15005
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int a[4 * dim], v[dim], n, m;
int x, y;
void build(int nod, int st, int dr);
void update(int nod, int st, int dr);
int query(int nod, int st, int dr);
int main()
{
int i, caz;
fin >> n >> m;
for (i = 1; i <= n; i++)
fin >> v[i];
build(1, 1, n);
for (i = 1; i <= m; i++) {
fin >> caz >> x >> y;
if (caz == 0)
update(1, 1, n);
else
fout << query(1, 1, n) << "\n";
}
return 0;
}
void build(int nod, int st, int dr)
{
if (st == dr)
a[nod] = v[st];
else {
int mij = (st + dr) / 2;
build(nod * 2, st, mij);
build(nod * 2 +1 , mij + 1, dr);
a[nod] = a[2 * nod] + a[2 * nod + 1];
}
}
void update(int nod, int st, int dr)
{
if (st == dr)
a[nod] -= y;
else {
int mij = (st + dr) / 2;
if (x <= mij)
update(nod * 2, st, mij);
else
update(nod * 2 + 1, mij + 1, dr);
a[nod] = a[2 * nod] + a[2 * nod + 1];
}
}
int query(int nod, int st, int dr)
{
if (x <= st && y >= dr)
return a[nod];
else {
int mij = (st + dr) / 2;
if (y <= mij)
query(nod * 2, st, mij);
if (x >= mij + 1)
query(nod * 2 + 1, mij + 1, dr);
return query(nod * 2, st, mij) + query(nod * 2 + 1, mij + 1, dr);
}
}