Pagini recente » Borderou de evaluare (job #1731237) | Borderou de evaluare (job #244920) | Cod sursa (job #1800682) | Monitorul de evaluare | Cod sursa (job #2606762)
#include <fstream>
#include <cmath>
#define max(a, b) ((a > b) ? (a) : (b))
#define MAX 100005
using namespace std;
int arr[MAX], n, m;
int arbore[4 * MAX + 1];
int a, b;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
void init(int left, int right, int son) {
if (left == right) {
arbore[son] = arr[left];
return;
}
int mid = (left + right) / 2;
init(left, mid, 2 * son);
init(mid + 1, right, 2 * son + 1);
arbore[son] = arbore[2 * son] + arbore[2 * son + 1];
}
void update(int left, int right, int son) {
if (left == right) {
arbore[son] -= b;
arr[left] -= b;
return;
}
int mid = (left + right) / 2;
if (a <= mid)
update(left, mid, 2 * son);
else
update(mid + 1, right, 2 * son + 1);
arbore[son] = arbore[2 * son] + arbore[2 * son + 1];
}
int getSum(int left, int right, int son) {
if (left >= a and right <= b)
return arbore[son];
int mid = (left + right) / 2;
int sum = 0;
if (a <= mid)
sum += getSum(left, mid, 2 * son);
if (b >= mid + 1)
sum += getSum(mid + 1, right, 2 * son + 1);
return sum;
}
int main() {
int x;
fin >> n >> m;
for (int i = 1;i <= n;i ++) {
fin >> arr[i];
}
init(1, n, 1);
int operation;
for (int i = 1;i <= m;i ++) {
fin >> operation >> a >> b;
if (!operation) {
update(1, n, 1);
}
else {
fout << getSum(1, n, 1) << '\n';
}
}
return 0;
}