Cod sursa(job #1542634)

Utilizator ASTELOTudor Enescu ASTELO Data 5 decembrie 2015 15:28:33
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include<cstdio>
int v[100001],n,m,i,j;
void update(int poz,int val)
    {
    int nod=poz;
    while(nod<=n)
        {
        v[nod]+=val;
        nod+=(nod^(nod&nod-1));
        }
    }
int find(int poz)
    {
    int s=0;
    int nod=poz;
    while(nod>=1)
        {
        s+=v[nod];
        nod-=(nod^(nod&nod-1));
        }
    return s;
    }
int main ()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
    {
    int xx;
    scanf("%d",&xx);
    update(i,xx);
    }
for(i=1;i<=m;i++)
    {
    int t,poz,val;
    scanf("%d",&t);
    if(t==0)
        {
        scanf("%d%d",&poz,&val);
        update(poz,val);
        }
    if(t==1)
        {
        scanf("%d%d",&poz,&val);
        printf("%d\n",find(val)-find(poz-1));
        }
    if(t==2)
        {
        scanf("%d",&val);
        int l1,l2,mid,o=-1;
        l1=1;
        l2=n;
        while(l1<=l2)
            {
            mid=(l1+l2)/2;
            int x=find(mid);
            if(x==val)
                {
                o=mid;
                break;
                }
            if(x>val)
                l2=mid-1;
            else
                l1=mid+1;
            }
        printf("%d\n",o);
        }
    }
return 0;
}