Cod sursa(job #1605907)

Utilizator andrey-jkOtopeleanu Andrei Cristian andrey-jk Data 19 februarie 2016 16:24:03
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <iostream>
#include <fstream>
using namespace std;
int n,m,i,x,op,p,A[60010],s,K;
ifstream f("datorii.in");
ofstream g("datorii.out");
void upd(int nod,int a,int b,int st,int dr)
{
     int m;
     if(a<=st&&dr<=b)
     {
         A[nod]+=x;
         return;
     }
     else
     {
         m=(st+dr)/2;
         if(a<=m)
            upd(2*nod,a,b,st,m);
         if(m<b)
            upd(2*nod+1,a,b,m+1,dr);
         A[nod]=A[2*nod]+A[2*nod+1];
     }
}
void finds(int nod,int a,int b,int st,int dr)
{
    int m;
    if(a<=st&&dr<=b)
    {
        s=s+A[nod];
        return ;
    }
    else
    {
        m=(st+dr)/2;
         if(a<=m)
            finds(2*nod,a,b,st,m);
         if(m<b)
            finds(2*nod+1,a,b,m+1,dr);
    }
}
void afis(int x,int k)
{
    if(k<=K+1)
    {
        g<<A[x]<<" ";
        afis(x*2,k+1);
        afis(x*2+1,k+1);
    }
}
void afis1(int x,int k)
{
    if(k<=K+1)
    {
        g<<x<<" ";
        afis1(x*2,k+1);
        afis1(x*2+1,k+1);
    }
}
int main()
{
    f>>n>>m;
    for(i=1;i<=n;i++)
    {
        f>>x;
        upd(1,i,i,1,n);
    }
    while((1<<K)<n)
    {
        K++;
    }
      for(i=1;i<=m;i++)
   {
       f>>op>>p>>x;
       if(op==0)
       {
           x*=-1;
           upd(1,p,p,1,n);
       }
       else
       {
           s=0;
           finds(1,p,x,1,n);
           g<<s<<endl;
       }
   }
    return 0;
}