Cod sursa(job #1335614)

Utilizator refugiatBoni Daniel Stefan refugiat Data 5 februarie 2015 19:23:25
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 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 c=0,i=1;
    while(i<n)
        i*=2;
    while(i>0)
    {
        if(val>=aib[c+i])
        {
            c+=i;
            val-=aib[c];
            if(val==0)
                return c;
        }
        i/=2;
    }
    return -1;
}
int q(int poz)
{
    int c=0,s=0;
    while(poz>0)
    {
        s+=aib[poz];
        while((poz&(1<<c))==0)
            ++c;
        poz-=c;
        ++c;
    }
    return s;
}
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==0)
                upd(n,x,y);
             else
                printf("%d\n",q(y)-q(x-1));
        }
        else
        {
            scanf("%d",&x);
            printf("%d\n",fpoz(x,n));
        }
    }
}