Cod sursa(job #1638614)

Utilizator NacuCristianCristian Nacu NacuCristian Data 8 martie 2016 00:44:28
Problema Arbori indexati binar Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <stdio.h>

#define increment(i) (i&(-i))

using namespace std;

int arb[100010];
int n,m;


void update(int p, int c)
{
    for(p;p<=n;p+=increment(p))
        arb[p]+=c;
}

int sum(int p)
{
    int s=0;
    for(p;p>0;p-=increment(p))
        s+=arb[p];
    return s;
}

int caut_bin(int st, int dr, int l)
{
    if(st>=dr)
        return -1;
    int mij=(st+dr)/2;
    int k=sum(mij);
    if(k==l)
        return mij;
    if(k<l)
        return caut_bin(mij+1,dr,l);
    return caut_bin(st,mij,l);

}

void citire()
{

    scanf("%d %d",&n,&m);

    for(int i=1;i<=n;i++)
    {
        int a;
        scanf("%d",&a);
        update(i,a);
    }

    for(int i=0;i<m;i++)
    {
        int a,b,c;
        scanf("%d ",&a);
        if(a==0)
        {
            scanf("%d %d",&b,&c);
            update(b,c);
        }

        else if(a==1)
        {
            scanf("%d %d",&b,&c);
            printf("%d\n",(sum(c)-sum(b-1)));
        }
        else if(a==2)
        {
            scanf("%d",&b);
            int k=caut_bin(0,n,b);
                printf("%d\n",k);
        }
    }
}


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