Cod sursa(job #2297372)

Utilizator cyg_andrei_HHendoreanu Andrei Sebastian cyg_andrei_H Data 5 decembrie 2018 19:18:41
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <cstdio>

using namespace std;

const int NMAX=100000;
int aib[NMAX+5];
int n;
void update(int p,int x)
{
    for(;p<=n;p+=(p&(-p)))
        aib[p]+=x;
}
int query(int p)
{
    int s;
    s=0;
    for(;p>=1;p-=(p&(-p)))
        s+=aib[p];
    return s;
}
int bs(int x)
{
    int st,dr,med;
    st=1;
    dr=n;
    while(st<=dr)
    {
        med=((st+dr)>>1);
        if(query(med)==x)
            return med;
        else
        {
            if(query(med)>x)
                dr=med-1;
            else
                st=med+1;
        }
    }
    return -1;
}
int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int m,i,a,b,o,rez;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i)
    {
        scanf("%d",&a);
        update(i,a);
    }
    for(i=1;i<=m;++i)
    {
        scanf("%d%d",&o,&a);
        if(!o)
        {
            scanf("%d",&b);
            update(a,b);
        }
        else
        {
            if(o==1)
            {
                scanf("%d",&b);
                rez=query(b)-query(a-1);
                printf("%d\n",rez);
            }
            else
            {
                rez=bs(a);
                printf("%d\n",rez);
            }
        }
    }
    return 0;
}