Cod sursa(job #1052470)

Utilizator BlackLordFMI Alex Oprea BlackLord Data 11 decembrie 2013 12:52:22
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <stdio.h>
#include <fstream>
#include <string.h>
using namespace std;
int n, m, i, a[100010], c, s, x, y, z, k;

void fa(int x, int v){
    c=0;
    while(x<=n)
    {
        a[x]+=v;
        while ( !(x & (1<<c)) )
            c++;
        x+=(1<<c);
        c+=1;
    }
}

int suma(int x){
    c=0, s=0;
    while(x>0)
    {
        s+=a[x];
        while( !(x & (1<<c)) )
            c++;
        x-=(1<<c);
        c+=1;
    }
    return s;
}

int cauta(int v){
    int i, p;
    for( p=1; p<n; p=(p<<1) );
    for(i=0; p; p>>=1 )
    {
        if(i+p<=n)
        {
            if(v>=a[i+p])
            {
                i+=p;
                v-=a[i];
                if(!v)
                    return i;
            }
        }
    }
    return -1;
}

int main(){
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for(i=1; i<=n; i++)
    {
        scanf("%d", &z);
        fa(i, z);
    }
    for(;m;m--)
    {
        scanf("%d", &k);
        if(k<2)
        {
            scanf("%d %d", &x, &y);
            if(!k)
                fa(x, y);
            else
                printf("%d\n", suma(y)-suma(x-1));
        }
        else
        {
            scanf("%d", &x);
            printf("%d\n", cauta(x));
        }
    }
}