Cod sursa(job #644675)

Utilizator Eugen01Vasilescu Eugen Eugen01 Data 7 decembrie 2011 12:21:01
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<stdio.h>

int ind,type,sol,x,y,i,j,n,m,H[30009];
char s[1000000];

void update(int nod,int st,int dr,int poz,int x)
{
	int m=(st+dr)/2;;
	
	if (st==dr) 
	{
		H[nod]-=x;
		return;
	}
	
	if (poz<=m) update(nod<<1,st,m,poz,x);
		else update((nod<<1)+1,m+1,dr,poz,x);
	
	H[nod]=H[(nod<<1)]+H[(nod<<1)+1];
}

void querry(int nod,int st,int dr,int a,int b)
{
	int m=(st+dr)/2;;
	
	if (a<=st&&dr<=b)
	{
		sol+=H[nod];
		return;
	}

	if (a<=m) querry(nod<<1,st,m,a,b);
	if (b>m) querry((nod<<1)+1,m+1,dr,a,b);
}

bool isnumber(char ch)
{
	if (ch>='0'&&ch<='9') return true;
	return false;
}

int getnumber()
{
	int nr=0;
	
	while (!isnumber(s[ind])) ind++;
	
	while (isnumber(s[ind]))
	{
		nr=nr*10+(s[ind]-'0');
		ind++;
	}
	
	return nr;
}

int main()
{
	freopen("datorii.in","r",stdin);
	freopen("datorii.out","w",stdout);
	
	fread(s,1,1000000,stdin);
	ind=0;
	n=getnumber();
	m=getnumber();
	
	
	for (i=1;i<=n;++i)
	{
		x=getnumber();
		update(1,1,n,i,-x);
	}
	
	for (i=1;i<=m;++i)
	{
		type=getnumber();
		x=getnumber();
		y=getnumber();
		if (type==0) update(1,1,n,x,y);
			else 
			{
				sol=0;
				querry(1,1,n,x,y);
				printf("%d\n",sol);
			}
	}
}