Cod sursa(job #544307)

Utilizator Ast09Stoica Anca Ast09 Data 1 martie 2011 13:21:01
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include<fstream.h>
ifstream f("datorii.in");
ofstream g("datorii.out");
int N,M,MaxArb[60071],val,pos,suma,a,b;
void update(int,int,int);
void query(int,int,int);

int main()
{ int x,i;
  f>>N>>M;
  for(i=1;i<=N;i++)
	  { f>>x;
	    pos=i; val=x;
		update(1,1,N);
	  }
  for(i=1;i<=M;i++)
	  { f>>x>>a>>b;
	    if(1==x) 
			{ suma=0;
			  query(1,1,N);
			  g<<suma<<'\n';
			}
			else {pos=a; val=b;
				  update(1,1,N);
				 }
	  }
  f.close(); g.close();
  return 0;
}

void update(int x,int st,int dr)
{ if(st==dr)
	{ if(MaxArb[x]) MaxArb[x]-=val;
			else MaxArb[x]=val; 
	return; }
  int m=(st+dr)/2;
  if(pos<=m) update(2*x,st,m);
	  else   update(2*x+1,m+1,dr);
  MaxArb[x]=MaxArb[2*x]+MaxArb[2*x+1];
}

void query(int x,int st,int dr)
{ if(a<=st&&dr<=b)
	  { suma+=MaxArb[x]; return;}
  int m=(st+dr)/2;
  if(a<=m) query(2*x,st,m);
  if(m<b) query(2*x+1,m+1,dr);
}