Cod sursa(job #903201)

Utilizator mads2194FMI - Andrei Stroe mads2194 Data 1 martie 2013 19:05:59
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 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;
    step = 1<<20;
    for(i=N;step;step>>=1)
    {
        t=i-step;
        if(t>0) if(t<=N && Compute(t)>=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;
}