Cod sursa(job #2207861)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 27 mai 2018 03:52:04
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <cstdio>

using namespace std;

int v[100001],n;
long long s[100001];

int zero_terminale(int i)
{
    return (i^(i-1))&i;
}

void add(int p,int x)
{
    for(int i=p; i<=n; i+=zero_terminale(i))
        s[i]+=x;
}

long long sum(int p)
{
    int rez=0LL;
    for(int i=p; i>0; i-=zero_terminale(i))
        rez+=s[i];
    return rez;
}

int main()
{
    int q,i,a,b,pas,k,m;
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1; i<=n; i++)
    {
        scanf("%d",&v[i]);
        add(i,v[i]);
    }
    while(m--)
    {
        scanf("%d",&q);
        switch(q)
        {
            case 0: scanf("%d%d",&a,&b);
                    add(a,b);
                    break;
            case 1: scanf("%d%d",&a,&b);
                    printf("%lld\n",sum(b)-sum(a-1));
                    break;
            default:
                scanf("%d",&a);
                pas=1<<16;
                k=0;
                while(pas)
                {
                    if(pas+k<=n && sum(pas+k)<=a)
                        k+=pas;
                    pas/=2;
                }
                if(sum(k)==a)
                    printf("%d\n",k);
                else
                    printf("-1\n");
        }
    }

    return 0;
}