Cod sursa(job #903124)

Utilizator mads2194FMI - Andrei Stroe mads2194 Data 1 martie 2013 18:37:40
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 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 = MaxStep;
    for(i=N;step>0;step>>=1)
    {
        t = i-step;
        if(t>0) if(t<N && Compute(t)>=val)
            i-=step;
    }
    return i;
}

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;
}