Pagini recente » Cod sursa (job #554698) | Cod sursa (job #2363731) | Cod sursa (job #203775) | Cod sursa (job #2284476) | Cod sursa (job #2444990)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int n, m, v[15006], p, x, y, arb[15006];
void build(int st, int dr, int nod_curent);
void update();
int query(int st, int dr, int nod_curent);
void build(int st, int dr, int nod_curent)
{
if (st > dr) return;
if (st == dr)
{
arb[nod_curent] = v[st];
return;
}
int mid = (st + dr) / 2, fiu = nod_curent * 2;
build(st, mid, fiu);
build(mid + 1, dr, fiu + 1);
arb[nod_curent] = arb[fiu] + arb[fiu + 1];
}
int query(int st, int dr, int nod_curent)
{
if (st > dr) return 0;
if (st > y || dr < x) return 0;
if (st >= x && st <= y && dr >= x && dr <= y) return arb[nod_curent];
int mid = (st + dr) / 2, fiu = nod_curent * 2;
return query(st, mid, fiu) + query(mid + 1, dr, fiu + 1);
}
void update(int st, int dr, int nod_curent)
{
if (x > dr || x < st) return;
if (st > dr) return;
if (st == dr)
{
arb[nod_curent] -= y;
return;
}
int mid = (st + dr) / 2, fiu = nod_curent * 2;
update(st, mid, fiu);
update(mid + 1, dr, fiu + 1);
arb[nod_curent] = arb[fiu] + arb[fiu + 1];
}
int main()
{
fin >> n >> m;
for (int i = 1; i <= n; ++i)
{
fin >> v[i];
}
build(1, n, 1);
while (m--)
{
fin >> p >> x >> y;
if (p == 1)
{
fout << query(1, n, 1) << "\n";
}
else
{
update(1, n, 1);
}
}
return 0;
}