Pagini recente » Cod sursa (job #448571) | Cod sursa (job #1004738) | Cod sursa (job #1258891) | Cod sursa (job #1856029) | Cod sursa (job #2230405)
#include <bits/stdc++.h>
#define MaxN 15005
#define TreeSize (int)(4 * MaxN + 50)
std::ifstream InFile("datorii.in");
std::ofstream OutFile("datorii.out");
int N, M;
// Explanation for Dummies like me (nu degeaba am stat cat am stat in fata unui calculator cu biti)
// Magic[x] - da suma ultimelor x&(-x) numere, terminandu-se cu pozitia x
// x&(-x) da bitul cel mai din dreapta
// Numarul de pe pozitia x este cu siguranta continut de x + x&(x-1) si de aia adaugam in Update
int Magic[MaxN];
int Val[MaxN];
void Update(int Position, int Value) {
while(Position <= N) {
Magic[Position] += Value;
Position += Position&(-Position);
}
}
int Query(int Position) {
int Sum = 0;
while(Position) {
Sum += Magic[Position];
Position -= Position&(-Position);
}
return Sum;
}
void Citire() {
InFile >> N >> M;
for (int i=0, x; i<N; i++) {
InFile >> x;
Update(i+1, x);
}
}
void Rezolvare() {
for (int i=0, QueryType, x, y; i<M; i++) {
InFile >> QueryType;
InFile >> x >> y;
if(QueryType == 1)
OutFile << Query(y) - Query(x-1) << '\n';
else
Update(x, -y);
}
}
int main()
{
Citire();
Rezolvare();
return 0;
}