Cod sursa(job #2552390)

Utilizator PaterucAPetruc Andrei Stefan PaterucA Data 20 februarie 2020 20:06:21
Problema Arbori indexati binar Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>

using namespace std;

ifstream inf("aib.in");
ofstream outf("aib.out");

int n, m, v[100010], aib[100010];

void aib_add(int , int );
int aib_get(int ), tcomp(int );

int main()
{
    inf>>n>>m;
    for(int i=1; i<=n; i++)
        inf>>v[i],aib_add(i, v[i]);
    for(;m;m--)
    {
        int tip, a, b;
        inf>>tip;
        if(tip==0)
        {
            inf>>a>>b;
            aib_add(a,b);
        }
        else if(tip==1)
        {
            inf>>a>>b;
            outf<<aib_get(b)-aib_get(a-1)<<'\n';
        }
        else
        {
            inf>>a;
            int sol=-1;
            for(int i=1; sol==-1&&i<=n; i++)
                if(aib_get(i)==a)
                    sol=i;
            outf<<sol<<'\n';
        }
    }
    return 0;
}

int tcomp(int a)
{
    return (~a)+1;
}

void aib_add(int ind, int val)
{
    int nxt=ind+(ind&tcomp(ind));
    aib[ind]+=val;
    while(nxt<=n)
    {
        aib[nxt]+=val;
        nxt=nxt+(nxt&tcomp(nxt));
    }

}

int aib_get(int ind)
{
    int curr=ind, ret=0;
    while(curr>0)
    {
        ret+=aib[curr];
        curr=curr-(curr&tcomp(curr));
    }
    return ret;
}