Cod sursa(job #903149)

Utilizator mads2194FMI - Andrei Stroe mads2194 Data 1 martie 2013 18:46:46
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define MN 100002
#define zeros(x) x&-x
#define MaxStep 1<<17

int AIB[MN];
int N;

void Add(int pos, int val)
{
    for (int i = pos; i <= N; i += zeros(i))
        AIB[i] += val;
}

int Compute(int pos)
{
    int ret = 0;

    for (int i = pos; i > 0; i -= zeros(i))
        ret += AIB[i];
    return ret;
}

int Search(int val)
{
    long i,step,t;
    for ( step = 1; step < N; step <<= 1 );
    for(i=0;step>0;step>>=1)
    {
        if(i+step<=N && Compute(i+step)>=val)
            i+=step;
    }
    if(Compute(i)==val) return i;
    return -1;
}

int main()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);

    int m,type,x,y;
    scanf("%d%d",&N,&m);

    for(int i=1;i<=N;++i)
    {
        scanf("%d",&x);
        Add(i,x);
    }

    while(m--)
    {
        scanf("%d",&type);
        if(type==0)
        {
            scanf("%d%d",&x,&y);
            Add(x,y);
        }
        else if(type==1)
        {
            scanf("%d%d",&x,&y);
            printf("%d\n",Compute(y)-Compute(x-1));
        }
        else
        {
            scanf("%d",&x);
            printf("%d\n",Search(x));
        }
    }
    return 0;
}