Cod sursa(job #507208)

Utilizator AnDrEwBoYA Andrei AnDrEwBoY Data 5 decembrie 2010 16:09:16
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
//arbore binar 1D
#include<cstdio>
#define MAXN 100000+10
using namespace std;
int n,m,i,v,act,a,b,A[MAXN],pp,search(int),query(int);
void solve(),update(int,int);
int main()
{
    solve();
    return 0;
}
void solve()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++) scanf("%d",&v),update(i,v);
    for(pp=1;pp<n;pp<<=1);
    for(;m;m--)
    {
        scanf("%d",&act);
        if(act==0)scanf("%d%d",&a,&b),update(a,b);
        if(act==1)scanf("%d%d",&a,&b),printf("%d\n",query(b)-query(a-1));
        if(act==2)scanf("%d",&a),printf("%d\n",search(a));
    }
}
void update(int p,int val)
{
    for(;p<=n;p+= (p&-p))
        A[p]+=val;
}
int query(int p)
{
    int s=0;
    for(;p>0;p-=(p&-p))
        s+=A[p];

    return s;
}
int search(int v)
{
    int pt,i;
    for(pt=pp,i=0;pt>0;pt>>=1)
    {
        if(pt+i<=n && v>=A[pt+i])
        {
            v-=A[pt+i];i+=pt;
            if(!v)return i;
        }
    }
    return -1;
}