Cod sursa(job #612415)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 7 septembrie 2011 15:18:40
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.86 kb
#include<fstream>
using namespace std;
int n,N,m,A[40010];
int a,b,suma;

void ConstruireArbore()
{
	int i;
	for(i=N-1;i>0;i--)
		A[i]=A[2*i]+A[2*i+1];
}

void Query(int nod,int st,int dr)
{
	if(a<=st && dr<=b)
	{
		suma=suma+A[nod];
		return;
	}
	int mij=(st+dr)/2;
	if(a<=mij) Query(2*nod,st,mij);
	if(mij+1<=b) Query(2*nod+1,mij+1,dr);
}

void Update()
{
	int k=N+a-1;
	A[k]-=b;
	k=k/2;
	while(k>0)
	{
		A[k]=A[2*k]+A[2*k+1];
		k=k/2;
	}
}

int main()
{
	int i,op;
	ifstream fin("datorii.in");
	fin>>n>>m;
	
	N=1;
	while(n>N)
		N=N*2;
	
	for(i=1;i<=n;i++)
		fin>>A[N+i-1];
	
	ConstruireArbore();
	
	ofstream fout("datorii.out");
	for(i=1;i<=m;i++)
	{
		fin>>op>>a>>b;
		if(op==1)
		{
			suma=0;
			Query(1,1,N);
			fout<<suma<<"\n";
		}
		else
			Update();
	}
	
	fin.close();
	fout.close();
	return 0;
}