Cod sursa(job #996553)

Utilizator alexalghisiAlghisi Alessandro meitatiidirect.ro alexalghisi Data 12 septembrie 2013 12:05:57
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>

#define DN 100005
using namespace std;

int v[DN],n,m;

inline int lsb(int x)
{
    return x^(x&(x-1));
}

void update(int poz,int x)
{
    for(;poz<=n;poz+=lsb(poz))
        v[poz]+=x;
}

int query(int poz)
{
    int rez=0;
    for(;poz;poz-=lsb(poz))
      rez+=v[poz];
    return rez;
}

int main()
{
    ifstream f("aib.in");
    ofstream g("aib.out");
    f>>n>>m;
    for(int i=1;i<=n;++i)
   {
      int x;
      f>>x;
      update(i,x);
   }

    for(;m;--m)
    {
        int op;
        f>>op;
        if(op==0)
        {
            int a,b;
            f>>a>>b;
            update(a,b);
        }
        if(op==1)
        {
            int a,b;
            f>>a>>b;
            g<<query(b)-query(a-1)<<"\n";
        }
        if(op==2 )
        {
            int k,rez=0;
            f>>k;

            for(int bit=32;bit>=0;--bit)
            {

                if( rez+(1<<bit) <=n && v[ rez + (1<<bit) ]<=k )
                {
                    rez+=(1<<bit);
                    k-=v[rez];
                }
            }
            if(k)
              g<<"-1\n";
              else
            g<<rez<<"\n";
        }
    }

    return 0;
}