Cod sursa(job #2091033)

Utilizator AnduRazvanMindrescu Andu AnduRazvan Data 19 decembrie 2017 02:36:48
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <cstdio>

using namespace std;
int n,m,a[15001],s[30101],op,x,y,poz;
void Creare(int nod,int st,int dr)
{ int mij=st+(dr-st)/2;
    if(st==dr) s[nod]=a[st];
    else
    { Creare(nod*2,st,mij);
      Creare(nod*2+1,mij+1,dr);
      s[nod]=s[nod*2]+s[nod*2+1];
    }
}
int Suma(int nod,int st,int dr,int pozs,int pozd)
{ if(st>=pozs&&dr<=pozd) return s[nod];
  else if(st>pozd) return 0;
  else if(dr<pozs) return 0;
   else {
        int mij=st+(dr-st)/2;
        return Suma(nod*2,st,mij,pozs,pozd)+Suma(nod*2+1,mij+1,dr,pozs,pozd);
        }
}
int Find(int nod,int st,int dr,int x)
{ if(st==dr&&st==x) return nod;
    else {int mij=st+(dr-st)/2;
          if(mij<x) return Find(nod*2+1,mij+1,dr,x);
          else return Find(nod*2,st,mij,x);
         }
}
void Actualizare(int poz,int y)
{ s[poz]-=y;
    if(poz!=1) Actualizare(poz/2,y);
}
int main()
{ FILE *f,*g;
  f=fopen("datorii.in","r");
  g=fopen("datorii.out","w");
  fscanf(f,"%d %d",&n,&m);
  int i;
   for(i=1;i<=n;i++) fscanf(f,"%d",&a[i]);
   Creare(1,1,n);
   for(i=1;i<=m;i++)
    { fscanf(f,"%d %d %d",&op,&x,&y);
      if(op==1) fprintf(g,"%d\n",Suma(1,1,n,x,y));
      if(op==0) {poz=Find(1,1,n,x);Actualizare(poz,y);}
    }
    return 0;
}