Cod sursa(job #90167)

Utilizator BMCBou Marian Catalin BMC Data 8 octombrie 2007 18:59:59
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
//BMC
#include<stdio.h>
FILE *f,*g;
struct nod{int sum,a,b; nod *st,*dr;};

nod* create(int a,int b)
{
  nod *q;
  q=new nod;
  q->sum=0;
  q->a=a;
  q->b=b;
  if(a==b) q->st=q->dr=0;
  else
  {
    q->st=create(a,(a+b)/2);
    q->dr=create((a+b)/2+1,b);
  }
  return q;
}

void change(int p,int v,nod *q)
{
  q->sum+=v;
  if(q->a!=q->b)
    if(p>(q->a+q->b)/2) change(p,v,q->dr);
    else change(p,v,q->st);
}

int afis(int x,int y, nod *q)
{
  if(q->a==x&&y==q->b) return q->sum;
  if(x> (q->a+q->b)/2) return afis(x,y,q->dr);
  if(y<=(q->a+q->b)/2) return afis(x,y,q->st);
  return afis(x,(q->a+q->b)/2,q->st) + afis((q->a+q->b)/2+1,y,q->dr);
}

int main()
{
  int n,m,i,j,x,y,c,a;
  nod *rad;
  f=fopen("datorii.in","r");
  g=fopen("datorii.out","w");
  fscanf(f,"%d %d",&n,&m);
  rad=create(1,n);

  for(i=1;i<=n;i++)
  {
    fscanf(f,"%d ",&c);
    change(i,c,rad);
  }

  for(i=1;i<=m;i++)
  {
    fscanf(f,"%d %d %d",&c,&x,&y);
    if(c==0) change(x,-y,rad);
    else { a=afis(x,y,rad); fprintf(g,"%d\n",a); }
  }
  return 0;
}