Cod sursa(job #214290)

Utilizator dragosmihaiDragos Oana dragosmihai Data 13 octombrie 2008 19:38:15
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <stdio.h>
#include <fstream>

using namespace std;

long a[100002],n,m;

int k(int x)
{
    int z=0;
    while(!(x&1))
    {
        x>>=1;
        z++;
    }
    return z;
}

void aduna(long i,int x)
{
    while(i<=n)
    {
        a[i]+=x;
        i+=(1<<k(i));
    }
}

long suma(long poz)
{
    long s=0;
    while(poz>0)
    {
        s+=a[poz];
        poz-=(1<<k(poz));
    }
    return s;
}

int secventa(int val)
{
    int i,poz;
    for(poz=1;poz<n;poz<<=1);
    for(i=0;poz;poz>>=1)
    {
         if(i+poz<=n)

            if(val>=a[i+poz] )
            {
                i+=poz;
                val-= a[i];
                if (!val) return i;
            }
    }

    return -1;
}

void citire()
{
    memset(a,0,sizeof(a));
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%ld %ld",&n,&m);
    for(int i=1;i<=n;i++)
    {
        int x;
        scanf("%d",&x);
        aduna(i,x);
    }
    for(int i=1;i<=m;i++)
    {
        int x;
        scanf("%d",&x);
        if(x==0)
            {
                int a,b;
                scanf("%d %d",&a,&b);
                aduna(a,b);
            }
        if(x==1)
            {
                int a,b;
                scanf("%d %d",&a,&b);
                long s=suma(b)-suma(a-1);
                printf("%ld\n",s);
            }
        if(x==2)
            {
                int a;
                scanf("%d",&a);
                printf("%ld\n",secventa(a));
            }
    }
}

int main()
{
    citire();
    return 0;
}