Cod sursa(job #555472)

Utilizator CBogdanCiobanu Bogdan CBogdan Data 15 martie 2011 15:25:56
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include<cstdio>
using namespace std;

int n,m,c,a,b,i,pos,val,sum,arb[4*15000+66];

void read(),solve(),upd(int,int,int),query(int,int,int);

int main()
{
	read();
	solve();
	
	return 0;
}


void read()
{
	freopen("datorii.in","r",stdin);
	freopen("datorii.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
	{
		pos=i;scanf("%d",&val);
		val=-val;
		upd(1,1,n);
	}
}

void solve()
{
	for(;m;m--)
	{
		scanf("%d%d%d",&c,&a,&b);
		if(c==0)
		{
			pos=a;val=b;
			upd(1,1,n);
			continue;
		}
		if(c==1)
		{
			sum=0;
			query(1,1,n);
			printf("%d\n",sum);
		}
	}
}

void upd(int nod,int st,int dr)
{
	if(st==dr)
	{
		arb[nod]-=val;
		return;
	}
	
	int mid=(dr+st)/2;
	if(pos<=mid)upd(nod*2,st,mid);
	else       upd(nod*2+1,mid+1,dr);
	arb[nod]=arb[nod*2]+arb[nod*2+1];
}

void query(int nod,int st,int dr)
{
	if(a<=st&& dr<=b)
	{
		sum+=arb[nod];
		return;
	}
	
	int mid=(st+dr)/2;
	if(a<=mid)query(nod*2,st,mid);
	if(mid<b) query(nod*2+1,mid+1,dr);
}