Cod sursa(job #644668)

Utilizator The_DisturbedBungiu Alexandru The_Disturbed Data 7 decembrie 2011 11:44:19
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int m,n,i,j,a[30000],x,y,c,v[15069],q;
char s[50000],nr[10];
void update(int poz, int st, int dr, int x, int k)
{
	if(st==dr) { a[poz]=x;return; }
	if(k<=(st+dr)/2) update((poz<<1),st,((st+dr)>>1),x,k);
	else update((poz<<1)+1,((st+dr)>>1)+1,dr,x,k);
	a[poz]=a[poz*2]+a[poz*2+1];
}
int ask(int poz, int st, int dr, int x, int y)
{
	if(x<=st && dr<=y) return a[poz];
	int s=0;
	if(x<=(st+dr)/2)s+=ask(poz<<1,st,(st+dr)>>1,x,y);
	if((st+dr)/2<y)s+=ask((poz<<1)+1,((st+dr)>>1)+1,dr,x,y);
	return s;
}
inline int getnr(char s[])
{
	int w=1,p=0;
	for(int o=strlen(s)-1;o>=0;--o)
	{
		p+=( (int)s[o]-(int)'0' )*w;
		w*=10;
	}
	return p;
}
int main()
{
	freopen("datorii.in","r",stdin);
	freopen("datorii.out","w",stdout);
	/*ifstream f("datorii.in");
	ofstream g("datorii.out");*/
	scanf("%d %d\n",&n,&m);
	gets(s);
	strcat(s," ");
	for(i=1,j=0;i<=n;++i)
	{
		q=0;
		strcpy(nr,"");
		while(s[j]!=' ')nr[q++]=s[j++],nr[q]=NULL;
		++j;
		v[i]=getnr(nr);
		update(1,1,n,v[i],i);
	}
	for(i=0;i<m;++i)
	{
		//scanf("%d%d%d",&c,&x,&y);
		j=0;q=0;
		gets(s);
		strcat(s," ");
		strcpy(nr,"");
		while(s[j]!=' ')
			nr[q++]=s[j++],nr[q]=NULL;
		++j;
		c=getnr(nr);
		strcpy(nr,"");
		q=0; 
		while(s[j]!=' ')
			nr[q++]=s[j++],nr[q]=NULL;
		++j;
		x=getnr(nr);
		strcpy(nr,"");
		q=0;
		while(s[j]!=' ')
			nr[q++]=s[j++],nr[q]=NULL;
		++j;
		y=getnr(nr);
		if(c==0)
		{
			v[x]-=y;
			update(1,1,n,v[x],x);
		}
		else
		{
			q=ask(1,1,n,x,y);
			printf("%d\n",q);
		}
	}
	return 0;
}