Cod sursa(job #735926)

Utilizator visanrVisan Radu visanr Data 17 aprilie 2012 15:48:56
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;

#define nmax 100100

long arb[nmax],n,operatie,x,y,m;


void update(long poz,long val)
{
     while(poz<=n)
     {
                 arb[poz]+=val;
                 poz=poz+(poz&(-poz));
     }
}

long query(long poz)
{
    long sum=0;
    while(poz>0)
    {
                 sum+=arb[poz];
                 poz=poz-(poz&(-poz));
    }
    return sum;
}

long search(long val)
{
    long left=1,right=n,mid;
    while(left<=right)
    {
                     mid=(left+right)/2; 
                     if(query(mid)==val) return mid;
                     if(query(mid)<val) left=mid+1;
                     else right=mid-1;
    }
    return -1;
}

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    long i;
    scanf("%ld %ld", &n,&m);
    for(i=1;i<=n;i++)
    {
                     scanf("%ld", &x);
                     update(i,x);
    }
    for(i=1;i<=m;i++)
    {
                     scanf("%ld", &operatie);
                     if(operatie==0)
                     {
                                scanf("%ld %ld", &x,&y);
                                update(x,y);
                     }
                     if(operatie==1)
                     {
                                    scanf("%ld %ld", &x,&y);
                                    printf("%ld\n", query(y)-query(x-1));
                     }
                     if(operatie==2)
                     {
                                    scanf("%ld", &x);
                                    printf("%ld\n", search(x));
                     }
    }
    //scanf("%i", &i);
    return 0;
}