Cod sursa(job #2392091)

Utilizator ApolodorTudor Fernea Apolodor Data 29 martie 2019 17:34:16
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fi("aib.in");
ofstream fo("aib.out");

int n,m;
int a[100001],aib[100001];

void update(int i, int x)
{
    if(i<=n)
    {
        aib[i]+=x;
        int y=i&(-i);
        update(i+y,x);
    }
}

long long query(int i)
{
    if(i>=1)
    {
        long long ans=0;
        ans+=aib[i];
        int y=i&(-i);
        ans+=query(i-y);
        return ans;
    }
    return 0;
}

int Search(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;

}

int main()
{

    fi>>n>>m;
    for(int i=1; i<=n; i++)
        fi>>a[i];

    for(int i=1; i<=n; i++)
        update(i,a[i]);

    for(int i=1; i<=m; i++)
    {
        int x;
        int p1,p2;
        fi>>x;
        if(x==2)
        {
            fi>>p1;
            fo<<Search(p1)<<'\n';
        }
        else
        {
            fi>>p1>>p2;
            if(x==0)
                update(p1,p2);
            else
                fo<<query(p2)-query(p1-1)<<'\n';
        }
    }

    return 0;
}