Cod sursa(job #1334824)

Utilizator refugiatBoni Daniel Stefan refugiat Data 4 februarie 2015 18:20:16
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <stdio.h>
#include <fstream>
using namespace std;
int aib[100001];
void upd(int n,int poz,int val)
{
     int c=0;
     while(poz<=n)
     {
        aib[poz]+=val;
        while ((poz&(1<<c))==0)
            ++c;
        poz+=(1<<c);
        ++c;
     }
}

int fpoz(int val,int n)
{
    int i,st;

    for(st=1;st<n;st*=2);
    for(i=0;st!=0;st/=2)
    {
        if(i+st<=n)
        {
            if(val>=aib[i+st])
            {
                i+=st;
                val-=aib[i];
                if(!val)
                    return i;
            }
         }
    }
    return -1;
}
int q(int poz)
{
    int c=0,sum=0;
    while(poz>0)
    {
        sum+=aib[poz];
        while((poz&(1<<c))==0)
            ++c;
        poz-=(1<<c);
        ++c;
    }

    return sum;
}
int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int n,m;
    scanf("%i %i",&n,&m);
    int i,a;
    for(i=0;i<n;++i)
    {
        scanf("%i",&a);
        upd(n,i+1,a);
    }
    int k,x,y;
    for(;m>0;m--)
    {
        scanf("%d",&k);
        if(k<2)
        {
             scanf("%d%d",&x,&y);
             if(!k)
                upd(n,x,y);
             else
                printf("%d\n",q(y)-q(x-1));
        }
        else
        {
            scanf("%d",&x);
            printf("%d\n",fpoz(x,n));
        }
    }
}