Cod sursa(job #556520)

Utilizator raica_cristiraica dumitru cristian raica_cristi Data 16 martie 2011 10:27:41
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include<stdio.h>

#define dim 150150

int a,b,c[dim],n,m,k;
int bit(int x)
{
    return x&(-x);
   /* int nr;
    while ( i%2 == 0 )
    {
            nr ++ ;
            i/=2;
    }
    int el =1;
    for(int k=0 ; k<=nr ; k++)
    el = el*2;
    return el;*/
}
int querry(int x )
{
    int s=0;
    for(int i=x ; i>=1 ; i-=bit(i))
    {
        s+=c[i];
    }
    return s;
}

void update(int poz , int x)
{
    for(int i=poz ; i<=n ; i+=bit(i))
        c[i]+=x;
}
int find (int x)
{
    int st = 1,dr = n,y,mid;
    while ( st<=dr)
    {
        mid = (st + dr)/2;
       y=querry(mid);
       if ( y==x)
        return mid ;
        else
        if ( y>x)
        dr = mid -1;
        else
        st = mid+1;


    }
    return -1;
}
void solve()
{
    int x;
    scanf("%d %d",&n,&k );
    for(int i=1 ; i<=n;i++)
    {
        scanf("%d",&x );
        update (  i , x );
    }
    int op;
    for(int i=1 ; i<=k ; i++)
    {
        scanf("%d",&op);
        if ( op==0 )
        {
            scanf("%d %d",&a , &b);
            update (a,b);
        }
        else
        if ( op == 1 )
        {
            scanf("%d %d",&a,&b);
            printf("%d\n",querry(b)-querry(a-1));
        }
        else
        if ( op == 2 )
        {
            scanf("%d",&a);
          printf("%d\n",find(a));
}

    }

}

using namespace std;

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