Cod sursa(job #2567858)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 3 martie 2020 19:17:12
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>
#define Dim 100001
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
typedef long long ll;
ll N,M,A[Dim],S[Dim],aib[Dim],a,b,p;

ll Query(ll x)
{
    ll sum=0;
    while(x)
    {
        sum+=aib[x];
        x&=x-1;
    }
    return sum;
}

void Update(ll x)
{
    while(x<=N)
    {
        aib[x]+=b;
        x+= x & -x;
    }
}

int main()
{
    f>>N>>M;
    for(int i=1;i<=N;i++)
    {
        f>>A[i];
        S[i]=S[i-1]+A[i];

        ll dif= i & -i;
        aib[i]=S[i]-S[i-dif];
    }

    for(int i=1;i<=M;i++)
    {
        f>>p;
        if( p == 1)
        {
            f>>a>>b;
            g<<Query(b)-Query(a-1);
            g<<'\n';
        }
        else
        if(p==0)
        {
            f>>a>>b;
            Update(a);
        }
        else
        {
            f>>a;
            int st=1,dr=N;
            bool stop=0;
            while(st<=dr&&stop==0)
            {
                int mij=(st+dr)/2;
                ll val=Query(mij);

                if( val == a )
                {
                    g<<mij;
                    stop=1;
                }
                else
                if( val < a ) st=mij+1;
                else dr=mij-1;
            }
            if(!stop) g<<-1;
            g<<'\n';
        }


    }

    return 0;
}