Cod sursa(job #2632498)

Utilizator KlinashkaDiacicov Calin Marian Klinashka Data 3 iulie 2020 14:51:48
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <bits/stdc++.h>
using namespace std;


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

const int NMAX=15001;
int tree[4*NMAX+1], arr[NMAX+1];

void build(int v, int st, int dr)
{
	if(st==dr)
	{
		tree[v]=arr[st];
		return;
	}
	int mj=(st+dr)/2;
	build(2*v, st, mj);
	build(2*v+1, mj+1, dr);
	tree[v]=tree[2*v]+tree[2*v+1];
}

void update(int v, int st, int dr, int i, int x)
{
	if(st==dr)
	{
		tree[v]-=x;
		return;
	}
	int mj=(st+dr)/2;
	if(i<=mj)
		update(2*v, st, mj, i, x);
	else
		update(2*v+1, mj+1, dr, i, x);
	tree[v]=tree[2*v]+tree[2*v+1];
}

int query(int v, int st, int dr, int l, int r)
{
	if(st>r || dr<l)
		return 0;
	if(l<=st && dr<=r)
		return tree[v];
	int mj=(st+dr)/2;
	return query(2*v, st, mj, l, r)+query(2*v+1, mj+1, dr, l, r);
}


int main()
{
	int N, M, p, a, b;
	fin>>N>>M;
	for(int i=1;i<=N;++i)
		fin>>arr[i];
	build(1, 1, N);
	for(int i=0;i<M;++i)
	{
		fin>>p>>a>>b;
		if(p==0)
			update(1, 1, N, a, b);
		if(p==1)
			fout<<query(1, 1, N, a, b)<<'\n';
	}
	return 0;
}