Cod sursa(job #251033)

Utilizator crawlerPuni Andrei Paul crawler Data 1 februarie 2009 17:49:49
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <stdio.h>

#define Nmax 100100

int x[Nmax],n;

void up(int poz,int nr)
{
    for (;poz<=n;poz+=poz&(poz-1)^poz)
    x[poz] += nr;
}

int q(int poz)
{
    int ret=0;
    for (;poz>0;poz-=poz&(poz-1)^poz)
    ret += x[poz];
    return ret;    
}

void solve()
{
    int op;
    scanf("%d", &op);
    if (op==0)
    {
        int a,b;
        scanf("%d%d", &a,&b);
        up(a,b);    
    }    
    else
    if (op==1)
    {
        int a,b;
        scanf("%d%d", &a,&b);
        printf("%d\n",q(b)-q(a-1));        
    }
    else
    if (op==2)
    {
        int ret=0, sum;
        scanf("%d", &sum);        
        for (int i=n;i>0;i/=2)  if (ret+i <= n)
        if (q(ret+i)<=sum) ret+=i;
        if (q(ret) == sum)
        printf("%d\n", ret);
        else
        printf("-1\n");
    }
}

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    
    int t,el;
    
    scanf("%d%d", &n,&t);   
    
    for (int i=1;i<=n;++i)
    {
        scanf("%d", &el);
        up(i,el);    
    }
    
    while (t--) solve();
        
    return 0;    
}