Cod sursa(job #1655334)

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

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,*fout;
    fin=fopen("aib.in","r");
    fout=fopen("aib.out","w");
    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)
            {
                fprintf(fout,"%d\n",query(b)-query(a-1));
            }
            else
            {
                update(a,b);
            }
        }
        else
        {
            fscanf(fin,"%d",&a);
            fprintf(fout,"%d\n",Search(a));
        }
    }
    return 0;
}