Cod sursa(job #1119514)

Utilizator robert_stefanRobert Stefan robert_stefan Data 24 februarie 2014 18:16:29
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <fstream>
#define IN "datorii.in"
#define OUT "datorii.out"
#define NMAX 15005

using namespace std;

ifstream in(IN);
ofstream out(OUT);

int n, m, v[NMAX], arbore[4*NMAX], suma;

inline void creare(int nn, int st, int dr)
{
	if(st==dr)
		arbore[nn]=v[st];
	else
	{
		int mijl=(st+dr)/2;
		creare(2*nn, st, mijl);
		creare(2*nn+1, mijl+1, dr);
		arbore[nn]=arbore[2*nn]+arbore[2*nn+1];
	}
}

inline void actualizare(int nn, int st, int dr, int zi, int val)
{
	if(st==dr)
		arbore[nn]-=val;
	else
	{
		int mijl=(st+dr)/2;
		if(zi<=mijl)
			actualizare(2*nn, st, mijl, zi, val);
		else
			actualizare(2*nn+1, mijl+1, dr, zi, val);
		arbore[nn]=arbore[2*nn]+arbore[2*nn+1];
	}
}

inline void verifica(int nn, int st, int dr, int a, int b)
{
	if(a<=st && b>=dr)
		suma+=arbore[nn];
	else
	{
		int mijl=(st+dr)/2;
		if(a<=mijl)
			verifica(2*nn, st, mijl, a, b);
		if(mijl<b)
			verifica(2*nn+1, mijl+1, dr, a, b);
	}
}

int main()
{
	int i, a, b, cod;
	in>>n>>m;
	for(i=1; i<=n; ++i)
	{
		in>>v[i];
		actualizare(1, 1, n, i, -v[i]);
	}
	//creare(1, 1, n);
	while(m--)
	{
		in>>cod>>a>>b;
		if(!cod)
			actualizare(1, 1, n, a, b);
		else
		{
			suma=0;
			verifica(1, 1, n, a, b);
			out<<suma<<'\n';
		}
	}
	in.close();
	out.close();
	return 0;
}