Cod sursa(job #2818681)

Utilizator TudosieRazvanTudosie Marius-Razvan TudosieRazvan Data 16 decembrie 2021 18:00:03
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <cstring>
#include <climits>
using namespace std;

int n, m;
int arbore[400001], v[100001];

ifstream fin("datorii.in");
ofstream fout("datorii.out");



void build(int nod, int st, int dr)
{
	if (st == dr)
	{
		arbore[nod] = v[st];
	}
	else {
		int mij = (st + dr) / 2;
		build(nod * 2, st, mij);
		build(nod * 2 + 1, mij + 1, dr);

		arbore[nod] = arbore[nod * 2]+ arbore[nod * 2 + 1];
	}
}

void update(int nod, int st, int dr, int poz, int val)
{
	if (st == dr)
	{
		arbore[nod] += val;
	}
	else {
		int mij = (st + dr) / 2;
		if (poz <= mij)
		{
			update(2 * nod, st, mij, poz, val);
		}
		else
		{
			update(2 * nod + 1, mij + 1, dr, poz, val);
		}


		arbore[nod] = arbore[nod * 2]+ arbore[nod * 2 + 1];
	}
}

int query(int nod, int st, int dr, int qSt, int qDr)
{
	if (qSt <= st && dr <= qDr)
	{
		return arbore[nod];
	}
	else {
		int mij = (st + dr) / 2;

		if (qDr <= mij)
		{
			return query(nod * 2, st, mij, qSt, qDr);
		}
		if (mij + 1 <= qSt)
		{

			return query(nod * 2 + 1, mij + 1, dr, qSt, qDr);
		}
		return query(nod * 2, st, mij, qSt, qDr)+
			query(nod * 2 + 1, mij + 1, dr, qSt, qDr);
	}
}

int main()
{
	fin >> n>>m;
	for (int i = 1; i <= n; i++)
	{
        fin>>v[i];
	}
	build(1, 1, n);
	for (int i = 1; i <= m; i++)
	{
		int  t,a, b;
		fin >>t>> a >> b;
		if(t==0)
        {
            update(1,1,n,a,-b);
        }
        else if(t==1)
        {
            fout<<query(1, 1, n, a, b)<<"\n";
        }

	}
	return 0;
}