Cod sursa(job #936687)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 8 aprilie 2013 12:30:33
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
#define zeros(x) (x&(x^(x-1)))
using namespace std;
#define LE 100666
ifstream f("aib.in");ofstream g("aib.out");
int n,m,x,i,j,a[LE],b,h_sum,aa;
int tree[LE],sums[LE],typ;

void update(int pos,int value)
{
   for(;pos<=n;pos+=zeros(pos))
     tree[pos]+=value;
}
int  query(int pos)
{
  int result=0;

  for(;pos>0;pos-=zeros(pos))
    result+=tree[pos];
  return result;
}
int  max_find(int hmax)
{
    int step,pos=0,total=0;
    for(step=1;step<=n;step<<=1);

    for(;step;step>>=1)
      if(pos+step<=n&&total+tree[pos+step]<=hmax)
        {
            pos+=step;
            total+=tree[pos+step];
        }
    return pos;
}
void build_tree()
{
    for(i=1;i<=n;++i)
      sums[i]=sums[i-1]+a[i];
    for(i=1;i<=n;++i)
      tree[i]=sums[i]-sums[i-zeros(i)];
}
int main()
{
   f>>n>>m;
   for(i=1;i<=n;++i) f>>a[i];
   build_tree();

   for(i=1;i<=m;++i)
   {
       f>>typ;
       if (typ==0)
       {
           f>>aa>>b;
           update(aa,b);
       }
       if (typ==1)
       {
           f>>aa>>b;
           g<<query(b)-query(aa-1)<<'\n';
       }
       if (typ==2)
       {
           f>>h_sum;
           g<<max_find(h_sum)<<'\n';
       }
   }

   f.close();g.close();
    return 0;
}