Cod sursa(job #1655328)

Utilizator mihaivasilacheMIhai Vasilache mihaivasilache Data 17 martie 2016 21:48:23
Problema Arbori indexati binar Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
using namespace std;

ofstream fout("aib.out");

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

int last(int a)
{
    return (a&(~(a-1)));
}

void update(int pos,int val)
{
    for(int i=pos; i<=n; i+=last(i))
        aib[i]+=val;
}

int query(int x)
{
    int res=0;
    for(int i=x; i>0; i-=last(i))
        res+=aib[i];
    return res;
}

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()
{
    FILE *fin;
    fin=fopen("aib.in","r");
    fscanf(fin,"%d%d",&n,&m);
    int i;
    int x;
    for(i=1; i<=n; i++)
    {
        fscanf(fin,"%d",&x);
        update(i,x);
    }
    int ins;
    int a,b;
    for(i=1; i<=m; i++)
    {
        fscanf(fin,"%d",&ins);
        if(ins<=1)
        {
            fscanf(fin,"%d%d",&a,&b);
            if(ins)
            {
                fout<<query(b)-query(a-1)<<endl;
            }
            else
            {
                update(a,b);
            }
        }
        else
        {
            fscanf(fin,"%d",&a);
            fout<<Search(a)<<endl;
        }
    }
    return 0;
}