Pagini recente » Monitorul de evaluare | Cod sursa (job #1320659) | Cod sursa (job #1384257) | Monitorul de evaluare | Cod sursa (job #2983357)
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream fin ("datorii.in");
ofstream fout ("datorii.out");
const int NMAX = 15000;
int v[NMAX + 5];
int rightmax, n;
vector <int> aint;
void build(int node = 1, int left = 1, int right = rightmax)
{
if(left == right and left > n)
{
aint[node] = 0;
return;
}
if(left == right)
{
aint[node] = v[left];
return;
}
int mid = (left + right) / 2;
build(2 * node, left, mid);
build(2 * node + 1, mid + 1, right);
aint[node] = aint[2 * node] + aint[2 * node + 1];
}
void update(int pos, int value, int node = 1, int left = 1, int right = rightmax)
{
if(left == right and left > n)
{
aint[node] = 0;
return;
}
if(left == right)
{
aint[node] -= value;
return;
}
int mid = (left + right) / 2;
if(pos <= mid)
update(pos, value, 2 * node, left, mid);
if(pos > mid)
update(pos, value, 2 * node + 1, mid + 1, right);
aint[node] = aint[2 * node] + aint[2 * node + 1];
}
int query(int left_q, int right_q, int node = 1, int left = 1, int right = rightmax)
{
if(left_q <= left and right <= right_q)
return aint[node];
int mid = (left + right) / 2;
int leftans = 0, rightans = 0;
if(left_q <= mid)
leftans += query(left_q, right_q, 2 * node, left, mid);
if(mid < right_q)
rightans += query(left_q, right_q, 2 * node + 1, mid + 1, right);
return leftans + rightans;
}
int main()
{
int q;
fin >> n >> q;
int exp = log2(n), nodes;
if((1 << exp) == n)
nodes = 2 * (1 << exp) - 1;
else
{
exp++;
nodes = 2 * (1 << exp) - 1;
}
aint.resize(nodes + 5);
rightmax = 1 << exp;
for(int i = 1; i <= n; i++)
fin >> v[i];
build();
for(int i = 1; i <= q; i++)
{
int op, x, y;
fin >> op >> x >> y;
if(op == 0)
update(x, y);
else if(op == 1)
fout << query(x, y) << '\n';
}
fin.close();
fout.close();
return 0;
}