Cod sursa(job #1654002)

Utilizator mihaivasilacheMIhai Vasilache mihaivasilache Data 16 martie 2016 19:16:23
Problema Arbori indexati binar Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 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);
    for(int i=1;i<=n;i++)
    {
        int x;
        fscanf(fin,"%d",&x);
        update(i,x);
    }
    for(int i=1;i<=m;i++)
    {
        int ins;
        int a,b;
        fscanf(fin,"%d",&ins);
        switch(ins)
        {
        case 0:
            {
                fscanf(fin,"%d%d",&a,&b);
                update(a,b);
                break;
            }
        case 1:
            {
                fscanf(fin,"%d%d",&a,&b);
                fout<<query(b)-query(a-1)<<endl;
                break;
            }
        case 2:
            {
                fscanf(fin,"%d",&a);
                fout<<Search(a)<<endl;
                break;
            }
        default:
            {
                break;
            }
        }
    }
    return 0;
}