Pagini recente » Cod sursa (job #874039) | Cod sursa (job #1235143) | Cod sursa (job #1881572) | Cod sursa (job #2054748) | Cod sursa (job #2753357)
#include <iostream>
using namespace std;
int v[33000], val, indexVal, intervalSt, intervalDr;
void actualizeaza(int pozNod, int indexSt, int indexDr) {
if (indexSt == indexDr) {
// Actualizare prin "delta", ca sa poata fi alterat numarul, nu decat inlocuit direct
v[pozNod] += val;
return;
}
int indexMijloc = (indexSt + indexDr) / 2;
if (indexVal <= indexMijloc) {
actualizeaza(2 * pozNod, indexSt, indexMijloc);
} else {
actualizeaza(2 * pozNod + 1, indexMijloc + 1, indexDr);
}
v[pozNod] = v[2 * pozNod] + v[2 * pozNod + 1];
}
int interogheaza(int pozNod, int indexSt, int indexDr) {
if (intervalSt <= indexSt && indexDr <= intervalDr) {
return v[pozNod];
}
int indexMijloc = (indexSt + indexDr) / 2, val1 = 0, val2 = 0;
if (intervalSt <= indexMijloc) {
val1 = interogheaza(2 * pozNod, indexSt, indexMijloc);
}
if (intervalDr > indexMijloc) {
val2 = interogheaza(2 * pozNod + 1, indexMijloc + 1, indexDr);
}
return val1 + val2;
}
int main() {
freopen("datorii.in", "r", stdin);
freopen("datorii.out", "w", stdout);
// Input rapid (daca nu pun asta, iau 0p in loc de 100p :( )
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
for (indexVal = 1; indexVal <= n; indexVal++) {
cin >> val;
actualizeaza(1, 1, n);
}
int c;
for (int i = 0; i < m; i++) {
cin >> c;
if (c == 0) {
cin >> indexVal >> val;
// Actualizarea se face prin +=, deci daca vrem sa scadem (cum cere in enunt), trebuie dat ca argument
// un numar negativ.
val = -val;
actualizeaza(1, 1, n);
} else if (c == 1) {
cin >> intervalSt >> intervalDr;
cout << interogheaza(1, 1, n) << "\n";
}
}
return 0;
}