Cod sursa(job #425251)

Utilizator stefan92alexandru stefan stefan92 Data 25 martie 2010 16:41:34
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<iostream.h>
#include<fstream.h>

fstream f("datorii.in",ios::in);
fstream g("datorii.out",ios::out);

struct arb{int in,sf,tat,suma,mij;}; arb t[30000];
int nod,v[100],stang[100],drept[100];

void arbore(int a,int b,int p,int d)
{if(a<b)
{t[++nod].in=a;
t[nod].sf=b;
t[nod].tat=p;
if(d==1)stang[p]=nod; else drept[p]=nod;
p=nod;
int m=(a+b+1)/2; t[nod].mij=m;
arbore(a,m-1,p,1);
arbore(m,b,p,0);
t[p].suma=t[stang[p]].suma+t[drept[p]].suma;}
else
{t[++nod].in=a;
t[nod].sf=a;
t[nod].tat=p;
if(d==1)stang[p]=nod; else drept[p]=nod;
t[nod].suma=v[a];
v[a]=nod;

}}



void update(int a,int b)
{if(a>0){
	t[a].suma=t[a].suma-b;
update(t[a].tat,b);}}

int query(int a,int b,int nd)
{if(a==t[nd].in&&b==t[nd].sf)
	return t[nd].suma;

else if(b<t[nd].mij) return query(a,b,stang[nd]);
if(a>=t[nd].mij) return query(a,b,drept[nd]);

if(a<t[nd].mij&&b>=t[nd].mij) return  query(a,t[nd].mij-1,stang[nd])+query(t[nd].mij,b,drept[nd]);}



int main()
{int n,r,i,a,b,c;
	f>>n>>r;
	
for(i=1;i<=n;i++)
	f>>v[i];
arbore(1,n,0,0);

for(i=1;i<=r;i++)
{f>>a>>b>>c;
if(a==0)
	update(v[b],c);
else cout<<query(b,c,1)<<endl;}

return 0;}