Cod sursa(job #1748903)

Utilizator Vladi.BarasBaras Nicholas Vladimir Laurentiu Vladi.Baras Data 27 august 2016 12:08:08
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>

using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
int s[100001], v1[100],m,n;
int putere(int a)
{if(a==0)return 1;
    int r=1;
    while((a&r)==0)
    {
        r<<=1;
    }
    return r;
}
int suma(int b)
{
    int r=1,a=0;
    while(b>0)
    {
        a+=s[b];
        r=putere(b);
        b-=r;
    }
    return a;
}

void actualizare(int a, int b)
{
    int poz=a,salt=0;
    while(poz<=n)
    {
        s[poz]+=b;
        salt=putere(poz);
        poz=salt+poz;
    }
}

void afis(int v[],int n)
{for(int i=1;i<=n;i++)
    cout<<v[i]<<" ";
}
int main()
{
    int a;
    cin>>n>>m;
    for(int i=1; i<=n; i++)
    {
        cin>>a;
        actualizare(i,a);
    }
    int x,y,z;
    for(int i=1; i<=m; i++)
    {
        cin>>x;
        if(x==0)
        {
            cin>>y>>z;
            actualizare(y,z);
        }
        if(x==1)
        {
            cin>>y>>z;
            cout<<suma(z)-suma(y-1)<<'\n';
        }
        if(x==2)
        {
            cin>>y;
            int k=1;
            while(suma(k)<y)
            {
                k++;
            }
            if(suma(k)==y)
            cout<<k<<'\n';
            else
                cout<<"-1\n";
        }
    }

    return 0;
}