Cod sursa(job #975374)

Utilizator andrettiAndretti Naiden andretti Data 19 iulie 2013 22:57:08
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<stdio.h>
#define maxn 100005
#define maxstep 1<<17
using namespace std;

int n,m;
int v[maxn],aib[maxn];

void update(int k,int val)
{
    int i=0;
    while(k<=n)
    {
        aib[k]+=val;
        for(;((k>>i)&1)==0;i++);
        k+=(1<<i);
        i++;
    }
}

int query(int k)
{
    int sum=0,i=0;
    while(k>0)
    {
        sum+=aib[k];
        for(;((k>>i)&1)==0;i++);
        k-=(1<<i);
        i++;
    }
    return sum;
}

int search(int val)
{
    int i,step=maxstep;
    int sum=0;

    for(i=0;step;step>>=1)
     if(i+step<=n && val>=aib[i+step]+sum)
      i+=step,sum+=aib[i];

    if(sum==val && sum>0 ) return i;
     return -1;
}


void read()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) {scanf("%d",&v[i]); update(i,v[i]);}
}

void solve()
{
    int i;
    int type,a,b;
    for(i=1;i<=m;i++)
    {
        scanf("%d",&type);
        if(type==0)
        {
            scanf("%d%d",&a,&b);
            update(a,b);
        }
        else
         if(type==1)
         {
             scanf("%d%d",&a,&b);
             printf("%d\n",query(b)-query(a-1));
         }
         else
         {
             scanf("%d",&a);
             printf("%d\n",search(a));
         }
    }
}

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

    read();
    solve();

    fclose(stdin);
    fclose(stdout);
    return 0;
}