Cod sursa(job #2308717)

Utilizator driver71528@gmail.comTerec Andrei-Sorin [email protected] Data 27 decembrie 2018 17:21:22
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#define last(x) (x & -x)
using namespace std;

typedef long long ll;

ll aib[100001];
int n;

void adaug(int i,ll z)
{
    for(int index=i;index<=n;index+=last(index))
        aib[index]+=z;
}
ll suma(int a)
{
    ll rez;
    for(rez=0;a;a-=last(a))
        rez+=aib[a];
    return rez;
}
int poz(ll s)
{
    int i=1,j=n;
    while(i<=j)
    {
        int m=(i+j)/2;
        ll csum=suma(m);
        if(csum==s)
            return m;
        else
            if(s<csum)
                j=m-1;
            else
                i=m+1;
    }
    return -1;
}


int main()
{
    ifstream f("aib.in");
    ofstream g("aib.out");
    int m;
    f>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int a;
        f>>a;
        adaug(i,a);
    }

    for(int i=1;i<=m;i++)
    {
        int t,a,b;
        f>>t>>a;
        if(t!=2)
            f>>b;
        switch(t)
        {
        case 0:
            adaug(a,b);
            break;
        case 1:
            g<<suma(b)-suma(a-1)<<'\n';
            break;
        case 2:
            g<<poz(a)<<'\n';
        }
    }
    f.close();
    g.close();
    return 0;
}