Cod sursa(job #1645834)

Utilizator tothalToth Alexandru tothal Data 10 martie 2016 13:59:49
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <fstream>
#define in "aib.in"
#define out "aib.out"
using namespace std;

int x[100005],aib[100005];
int n,m;
void update(int p,int v)
{
    for(int i=p;i<=n;i+=i&(-i))
        aib[i]+=v;
}
int query(int p)
{
    int s=0;
    for(int i=p;i>0;i-=i&(-i))
        s+=aib[i];
    return s;
}
int bin (int val)
{ int L=1,R=n;
    while(L<=R)
    {
        int mid=(L+R)/2;
        int s=query(mid);
         if(s==val)
                return mid;
            else
               {
                    if(s>val)
                {
                        R=mid-1;
                }
                else
                {
                    L=mid+1;
                }
               }
    }
    int mid=(L+R)/2;
    int s=query(mid);
    if(s==val)
        return mid;
        else
        return -1;
}
int bin2(int val)
{
    int i, step;

    for ( step = 1; step < n; step <<= 1 );

    for( i = 0; step; step >>= 1 )
    {
         if( i + step <= n)
         {
            if( val >= aib[i+step] )
            {
                i += step, val -= aib[i];
                if ( !val ) return i;
            }
         }
    }

    return -1;
}
void citire()
{    freopen(in,"r",stdin);
    freopen(out,"w",stdout);

scanf("%d%d",&n,&m);
int o,p,v;
    /*for(int i=1;i<=n;i++)
    {scanf("%d",&x[i]);
   for(int j=0;j<(i&(-i));j++)
            aib[i]=aib[i]+x[i-j];
    }*/
    for(int i=1;i<=n;i++)
    {
        int aux;
        scanf("%d",&aux);
        aib[i]=aux+query(i-1)-query(i-(i&(-i)));
    }
    for(int i=1;i<=m;i++)
    {
      scanf("%d",&o);
      if(o==0)
      {
          scanf("%d%d",&p,&v);
          update(p,v);
      }
      else
      {
          if(o==1)
          {
            scanf("%d%d",&p,&v);
            printf("%d\n",query(v)-query(p-1));
          }
          else
          {
              scanf("%d",&v);
              printf("%d\n",bin2(v));
          }
      }
    }
}
int main()
{
    citire();
}