Pagini recente » Borderou de evaluare (job #367091) | Cod sursa (job #1800562) | Cod sursa (job #1800750) | Cod sursa (job #3229896) | Cod sursa (job #2902705)
#include <fstream>
std::ifstream cin("datorii.in");
std::ofstream cout("datorii.out");
const int MAXN = 15001;
int arr[MAXN], tree[4 * MAXN], n, m, i, x, y, op;
void buildTree(int left, int right, int pos)
{
if (left == right)
{
tree[pos] = arr[i];
return;
}
int mid = left + (right - left) / 2;
if (i <= mid)
buildTree(left, mid, 2 * pos + 1);
if (i > mid)
buildTree(mid + 1, right, 2 * pos + 2);
tree[pos] = tree[2 * pos + 1] + tree[2 * pos + 2];
}
int sumTree(int left, int right, int pos)
{
if (x <= left && y >= right)
return tree[pos];
if (x > right || y < left)
return 0;
int mid = left + (right - left) / 2;
return sumTree(left, mid, 2 * pos + 1) + sumTree(mid + 1, right, 2 * pos + 2);
}
int main()
{
cin >> n >> m;
for (i = 0; i < n; i++)
{
cin >> arr[i];
buildTree(0, n - 1, 0);
}
for (i = 0; i <= m; i++)
{
cin >> op >> x >> y;
if (op == 0)
{
i = x - 1;
arr[i] -= y;
buildTree(0, n - 1, 0);
}
if (op == 1)
{
x--;
y--;
cout << sumTree(0, n - 1, 0) << '\n';
}
}
return 0;
}