Cod sursa(job #11741)

Utilizator megabyteBarsan Paul megabyte Data 1 februarie 2007 15:40:01
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <stdio.h>
#define INF "datorii.in"
#define OUF "datorii.out"
#define NMAX 16384
int sg[32768]={0},suma,a,b;

void insert(int nod,int st,int dr)
{
   if(a<=st&&dr<=b) sg[nod]=sum;
   else{
	  int mij,ok=1;
	   mij=(st+dr)/2;
	   if(a<=mij) 
	   {
		   sg[nod]+=sum;ok=0;
		   insert(2*nod,st,mij);
	   }
	   if(b>mij)
	   {
		   if(ok) sg[nod]+=sum;
		   insert(2*nod+1,mij+1,dr);
	   }
   }
}
void pay(int nod,int st,int dr)
{
	if(a<=st&&dr<=b) sg[nod]-=sum;
	else
	{
		int mij,ok=1;
		mij=(st+dr)/2;
		if(a<=mij)
		{
			sg[nod]-=sum;ok=0;
			pay(2*nod,st,mij);
		}
		if(b>mij)
		{
			if(ok) sg[nod]-=sum;
			pay(2*nod+1,mij+1,dr);
		}
	}
}
int quest(int nod,int st,int dr)
{
	if(a<=st&&dr<=b) return sg[nod];
	else
	{
		int mij,alfa=0,beta=0;
		mij=(st+dr)/2;
		if(a<=mij) alfa=quest(2*nod,st,mij);
		if(b>mij) beta=quest(2*nod+1,mij+1,dr);
		return alfa+beta;
	}
}
int main()
{
   register int n,i,op,p,m,q;
   //unsigned long long q;
   FILE *in,*out;
   in=fopen(INF,"r");
   out=fopen(OUF,"w");
   fscanf(in,"%d %d",&n,&m);
   for(i=1;i<=n;i++) 
   {
	   fscanf(in,"%d",&q); 
	   a=i;b=i;sum=q;
	   insert(1,1,n);
   }
   for(i=1;i<=m;i++)
   {
	   fscanf(in,"%d %d %d",&op,&p,&q);
	   if(op) 
	   {
		   a=p;b=q;
		   fprintf(out,"%d\n",quest(1,1,n));
	   }
	   else
	   {
		   a=b=p;sum=q;
		   pay(1,1,n);
	   }
   }
   fclose(in);fclose(out);
   return 0;
}