Cod sursa(job #2481474)

Utilizator ardutgamerAndrei Bancila ardutgamer Data 26 octombrie 2019 22:57:58
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
#define zeros(x) ( (pos ^ (pos - 1)) & pos )

using namespace std;

const int NMAX = 100005;

int n,q;
int aib[NMAX];

inline void add(int pos,int val)
{
    for(int i = pos ; i <= n ; i += zeros(i))
        aib[i] += val;
}

inline int sum(int pos)
{
    int ans = 0;
    int i = pos;
    while(i>0)
    {
        ans += aib[i];
        i -= zeros(i);
    }
    return ans;
}

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int x;
    scanf("%d%d",&n,&q);
    for(int i = 1 ; i <= n ; i++)
    {
        scanf("%d",&x);
        add(i,x);
    }
    while(q--)
    {
        int tip,a,b;
        scanf("%d",&tip);
        if(tip == 0)
        {
            scanf("%d%d",&a,&b);
            add(a,b);
        }
        else if(tip == 1)
        {
            scanf("%d%d",&a,&b);
            printf("%d\n",sum(b)-sum(a-1));
        }
        else
        {
            scanf("%d",&a);
            b = 0;
            for(int p = (1<<20) ; p ; p >>= 1)
                if(b+p <= n && sum(b+p) <= a)
                    b+=p;
            if(sum(b) == a && b)
                printf("%d\n",b);
            else
                printf("-1\n");
        }
    }
    return 0;
}