Cod sursa(job #2426848)

Utilizator andaraluca2001Anda Epure andaraluca2001 Data 29 mai 2019 18:05:26
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>

using namespace std;
// x&(-x)=cea mai mica putere a lui 2 care intra in descompunerea lui x

const int MAX=100006;
int aib[MAX],n,m,nr,cod,a,b;

ifstream in("datorii.in");
ofstream out("datorii.out");
int query(int p)
{
   int s=0;
   while(p>0)
   {
      s+=aib[p];
      p-=p&(-p);

   }

   return s;
}

void update(int p,int val) //adunam val pe pozitia p
{
  while(p<=n)
  {
       aib[p]+=val;
       p+=p&(-p);


  }


}

void update1(int p, int val)
  {  while(p<=n)
    {
        aib[p]-=val;
        p+=p&(-p);


    }


}
int caut(int val)
{
    int r=0,pas=1<<16;

    if(query(n)<val) return -1;
    while(pas!=0)
    {
       if(r+pas<=n && query(r+pas)<val) r+=pas;
       pas/=2;

}

    if(query(r+1)!=val) r=-1;
    else r++;
    return r;



}


int cautmaibun (int val)
{
    int r=0,pas=1<<16;
    int cval=val;
    if(query(n)<val) return -1;
    while(pas!=0)
    {
       if(r+pas<=n && aib[r+pas]<val)
       {
       r+=pas;
       val-=aib[r];
       //r+=pas;
       }

       pas/=2;
       }



    if(query(r+1)!=cval) r=-1;
    else r++;
    return r;



}
int main()
{
     in>>n>>m;

     for(int i=1;i<=n;i++)
     {
        in>>nr;
        update(i,nr);

     }

     for(int i=1;i<=m;i++)
     {
        in>>cod;
        if(cod==0)
        {
            in>>a>>b;
            update1(a,b);

        }

        if(cod==1)
        {
            in>>a>>b;
            out<<query(b)-query(a-1)<<"\n";


        }

     }
    return 0;
}