Cod sursa(job #1712995)

Utilizator nnnmmmcioltan alex nnnmmm Data 4 iunie 2016 14:26:05
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<cstdio>
#include<vector>
#include<algorithm>

int lsb(int val)
{
 return val&(-val);
}

class AIB
{
 private:
 int N;
 std::vector<int> elem;
 public:
 AIB();
 AIB(int _N);
 ~AIB();
 void Set_N(int _N);
 void Update(int val,int poz);
 int Query(int x);
 int Query(int x,int y);
};

AIB::AIB(int _N)
{
 Set_N(_N);
}

void AIB::Set_N(int _N)
{
 N=_N;
 elem.resize(N+1);
 for(int i=0;i<=N;i++)
     elem[i]=0;
}

AIB::~AIB()
{
 elem.erase(elem.begin(),elem.end());
}

void AIB::Update(int val,int poz)
{
 for(int i=poz;i<=N;i+=lsb(i))
     elem[i]+=val;
}

int AIB::Query(int x)
{
 int S=0;
 for(int i=x;i>=1;i-=lsb(i))
     {
      S+=elem[i];
     }
 return S;
}

int AIB::Query(int x,int y)
{
 return Query(std::max(x,y))-Query(std::min(x,y)-1);
}

int main()
{
 //FILE *in=fopen("a.in","r"),*out=fopen("a.out","w");
 FILE *in=fopen("datorii.in","r"),*out=fopen("datorii.out","w");
 int n,m;
 fscanf(in,"%d %d ",&n,&m);
 AIB X(n);
 for(int i=1;i<=n;i++)
     {
      int x;
      fscanf(in,"%d ",&x);
      X.Update(x,i);
     }
 for(int i=1;i<=m;i++)
     {
      int tip,a,b;
      fscanf(in,"%d %d %d ",&tip,&a,&b);
      if(tip==0)
         {
          X.Update(-b,a);
         }
      else
         {
          fprintf(out,"%d\n",X.Query(a,b));
          //fprintf(stderr,"%d\n",X.Query(a,b));
         }
     }
 fclose(in);
 fclose(out);
 return 0;
}