Cod sursa(job #2310031)

Utilizator cc4infinityCojocaru Catalin cc4infinity Data 30 decembrie 2018 14:42:52
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>

using namespace std;

int bit[100001],t[100001],i,j,poz,c,v,x,y,n,m;

void update(int poz,int n)
{
    while (poz<=n)
    {
        bit[poz]+=v;
        poz+=poz & (-poz);
    }
}

int sum(int poz)
{
    int s=0;
    while (poz>0)
    {
        s+=bit[poz];
        poz-=poz & (-poz);
    }
    return s;
}

int gasire(int s)
{
    int p=1;
    while (p<n) p<<=1;
    for (int i=0;p>0;p>>=1)
        if (i+p<=n)
        {
            if (s>=bit[i+p])
            {
                i+=p;
                s-=bit[i];
                if (!s) return i;
            }
        }
    return -1;
}

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d %d",&n,&m);
    for (i=1;i<=n;i++)
        scanf("%i",&t[i]);
     for (i=1;i<=n;i++)
    {
        v=t[i];
        update(i,n);
    }
    for (i=1;i<=m;i++)
    {
        scanf("%i",&c);
        if (c==0)
        {
            scanf("%i %i",&x,&v);
            update(x,n);
        }
        if (c==1)
        {
            scanf("%i %i",&x,&y);
            printf("%d \n",sum(y)-sum(x-1));
        }
        if (c==2)
        {
            scanf("%i",&x);
            printf("%i\n",gasire(x));
        }
    }
    return 0;
}