Cod sursa(job #558815)

Utilizator selea_teodoraSelea Teodora selea_teodora Data 17 martie 2011 14:24:44
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<fstream>
using namespace std;
int n,m,a[15005],i,val,pos,x,t,v,sum;
void update(int nod, int left, int right)
{
	if(left==right)
	{
		a[nod]=val;
		return;
	}
	int div=(left+right)/2;
	if(pos<=div)
		update(2*nod,left,div);
	else
		update(2*nod+1,div+1,right);
	a[nod]=a[2*nod]+a[2*nod+1];
}
void query(int nod,int left, int right)
{
	if(t<=left&&right<=v)
	{
		sum+=a[nod];
		return;
	}
	int div=(left+right)/2;
	if(t<=div)
		query(2*nod,left,div);
	if(v>div)
		query(2*nod+1,div+1,right);
}
void update_2(int nod, int left, int right)
{
	if(left==right)
	{
		a[nod]-=val;
		return;
	}
	int div=(left+right)/2;
	if(pos<=div)
		update(2*nod,left,div);
	else update(2*nod+1,div+1,right);
	a[nod]=a[2*nod]+a[2*nod+1];
}
int main()
{
	ifstream fin("datorii.in");
	fin>>n>>m;
	for(i=1;i<=n;i++)
	{
		fin>>val;
		pos=i;
		update(1,1,n);
	}
	ofstream fout("datorii.out");
	for(i=1;i<=m;i++)
	{
		fin>>x;
		if(x==1)
		{
			fin>>t>>v;
			sum=0;
			query(1,1,n);
			fout<<sum<<'\n';
		}
	   if(x==0)
	   {
		   fin>>pos>>val;
		   update_2(1,1,n);
	   }
	}
  fin.close();
  fout.close();
  return 0;
}