Pagini recente » Cod sursa (job #253107) | Cod sursa (job #618793) | Cod sursa (job #2661751) | Cod sursa (job #2321212) | Cod sursa (job #2622294)
#include <fstream>
std::ifstream in ("datorii.in");
std::ofstream out ("datorii.out");
const int MAXN = 15000;
int aib[MAXN + 1]; //aib[i] = suma subsecventei din v cu capetele: [i - 2k + 1; i]
int N; // k numarul de 0-uri terminale din reprezentarea binara a lui i
int terminale(int x) // 2^k pentru x
{
return x & (-x);
}
void Adauga(int zi, int val) // face v[zi] = val
{
for (int i = zi; i <= N; i += terminale(i))
aib[i] += val;
}
int Suma (int zi) // calculeaza suma v[1] + v[2] + ... + v[zi]
{
int s = 0;
for (int i = zi; i > 0; i -= terminale(i))
s += aib[i];
return s;
}
int main()
{
int M, nr, op, q1, q2;
in >> N >> M;
for (int i = 1; i <= N; ++i){
in >> nr;
Adauga(i, nr); // adauga nr la ziua i
}
for (int i=0; i < M; i++)
{
in >> op >> q1 >> q2;
if (op == 0)
Adauga (q1, - q2); // scad q2 din ziua q1, scad q2 din suma de achitat
if (op == 1)
out << Suma(q2) - Suma(q1 - 1) << '\n'; // datoriile din zilele [q1, q2] = [1, q2] - [1, q1-1]
}
return 0;
}