Cod sursa(job #829344)

Utilizator chimistuFMI Stirb Andrei chimistu Data 5 decembrie 2012 09:29:46
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <cstdio>
#include <cstdlib>

FILE*f=fopen("datorii.in","r");
FILE*g=fopen("datorii.out","w");
int n,arb[300000],m,val,pos,s,a,b,tip;
int sum(int a,int b)
{
	return (a+b);
}

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

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

int main()
{
	int x,i;
	fscanf(f,"%d%d",&n,&m);
	tip=1;
	for (i=1;i<=n;i++)
	{
		fscanf(f,"%d",&x);
		pos=i;val=x;
		update(1,1,n);
	}
	for (i=1;i<=m;i++)
	{
		fscanf(f,"%d",&tip);
		switch(tip){
	case 1:{fscanf(f,"%d%d",&a,&b);s=0;query(1,1,n);fprintf(g,"%d \n",s);break;}
	case 0:{fscanf(f,"%d%d",&a,&b);pos=a;val=b;update(1,1,n);break;}
		}
	}
	return 0;
}