Cod sursa(job #1703907)

Utilizator rotti321Rotar Mircea rotti321 Data 17 mai 2016 19:23:24
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int aib[100005],N,M;

void adauga(int val,int x)
{
    do
    {
        aib[x]+=val;
        x+=x&(-x);
    }
    while(x<=N);
}

int suma(int x)
{
    int s=0;
    while(x!=0)
    {
        s+=aib[x];
       // x &= x-1;
       x-=x&(-x);
    }
    return s;
}

void afis(int a[])
{
    for(int i=1;i<=N;i++)
    {
        cout<<a[i]<<" ";
    }
    cout<<"\n";
}
int cauta(int val)
{
    int i, step;

    for ( step = 1; step < N; step <<= 1 );
  //  cout<<"\n***"<<step<<"\n**\n";
    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;
}

int main()
{
    int val,k,x,y;
    f>>N>>M;
    for(int i=1;i<=N;i++)
    {
        f>>val;
        adauga(val,i);
    }
   // afis(aib);
    for(int i=1;i<=M;i++)
    {
        f>>k;
        if(k==0)
        {
            f>>x>>y;
            adauga(y,x); ///y-poz, x- val;
        }
        if(k==1)
        {
            f>>x>>y;
            g<<suma(y)-suma(x-1)<<"\n";
        }
        if(k==2)
        {
            f>>x;
            g<<cauta(x)<<"\n";
        }
    }
    return 0;
}