Cod sursa(job #2018190)

Utilizator stefzahZaharia Stefan Tudor stefzah Data 3 septembrie 2017 20:45:31
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <fstream>
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int aint[300005],n,m,i,p,a,b,v[100005],k,q,ct;
int question(int nod,int x,int y,int st,int dr)
        {int mid;
         if(x==st&&y==dr)return aint[nod];
         mid=(st+dr)>>1;
         if(y<=mid)return question(nod*2,x,y,st,mid);
         if(x>=mid+1)return question(nod*2+1,x,y,mid+1,dr);
         return question(nod*2,x,mid,st,mid)+question(nod*2+1,mid+1,y,mid+1,dr);
        }
void update(int a,int b)
    {int t;
     t=k+a-1;
     aint[t]=aint[t]-b;
     t=t/2;
     while(t!=0)
          {aint[t]=aint[t*2]+aint[t*2+1];
           t=t/2;
          }
    }
int main()
{fin>>n>>m;
 for(i=1;i<=n;i++)
    {fin>>v[i];
    }
    k=1;
 while(k<n)
      k=k*2;
 for(i=k;i<k+n;i++)
    {aint[i]=v[i-k+1];
    }
 for(i=k-1;i>=1;i--)
    {aint[i]=aint[i*2]+aint[i*2+1];
    }
    q=1;
    ct=0;
 for(i=1;i<k+n;i++)
    {ct++;
     if(ct==q){ct=0;q=q*2;}
    }
 for(i=1;i<=m;i++)
    {fin>>q>>a>>b;
     if(q==1) fout<<question(1,a,b,1,k)<<"\n";
       else update(a,b);
    }
}