Cod sursa(job #1167422)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 4 aprilie 2014 22:59:59
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<cstdio>

using namespace std;

const int NMAX = 100000+5;

void Read(),Solve();

int N,M;
int AIB[NMAX];

void Update(int i,int value)
{
    for(; i <= N; i += i&(-i))
        AIB[i] += value;
}

int Query(int i)
{
    int ans = 0;
    for(; i >= 1; i -= i&(-i))
        ans += AIB[i];
    return ans;
}

int BS(int sum)
{
    int left,right,middle;

    for(left = 1, right = N; left <= right; )
    {
        middle = (left + right)/2;

        if(Query(middle) < sum) left = middle+1;
        else if(Query(middle) > sum) right = middle;
        else return middle;
    }

    return -1;
}

int main()
{
    Read();
    Solve();

    return 0;
}

void Read()
{
    int i,x;

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

    scanf("%d%d",&N,&M);

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

void Solve()
{
    int t,a,b;

    for(; M; --M)
    {
        scanf("%d",&t);

        if(t == 0)
        {
            scanf("%d%d",&a,&b);
            Update(a,b);
        }

        if(t == 1)
        {
            scanf("%d%d",&a,&b);
            printf("%d\n",Query(b)-Query(a-1));
        }

        if(t == 2)
        {
            scanf("%d",&a);
            printf("%d\n",BS(a));
        }
    }
}