Cod sursa(job #2776956)

Utilizator lucriLuchian Cristian lucri Data 21 septembrie 2021 18:17:21
Problema Arbori indexati binar Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
long long n,m,sp[100010],s[100010],o,a,b;
void adaugare(long long poz,long long val)
{
    for(poz=poz;poz<=n;poz+=(poz&-poz))
        s[poz]+=val;
}
long long suma(long long poz)
{
    long long r=0;
    for(poz=poz;poz;poz-=(poz&-poz))
        r+=s[poz];
    return r;
}
long long cautare(long long sum)
{
    long long r=0,sr=0;
    while(r%2==0&&r<n&&sr<sum)
    {
        long long i;
        for(i=1;r+i<=n&&(r==0||i<(r&-r));i<<=1)
        {
            if(sr+s[r+i]>sum)
            {
                if(i==1)
                    return -1;
                else
                {
                    i>>=1;
                    break;
                }
            }
        }
        if(i>n||i==(r&-r))
            i>>=1;
        r+=i;
        sr+=s[r];
    }
    if(sr==sum)
        return r;
    return -1;
}
int main()
{
    in>>n>>m;
    for(int i=1;i<=n;++i)
    {
        in>>sp[i];
        sp[i]+=sp[i-1];
        s[i]=sp[i]-sp[i-(i&-i)];
    }
    for(int i=1;i<=m;++i)
    {
        in>>o;
        if(o==0)
        {
            in>>a>>b;
            adaugare(a,b);
        }
        else if(o==1)
        {
            in>>a>>b;
            out<<suma(b)-suma(a-1)<<'\n';
        }
        else
        {
            in>>a;
            out<<cautare(a)<<'\n';
        }
    }
    return 0;
}