Cod sursa(job #1199319)

Utilizator LurchssLaurentiu Duma Lurchss Data 18 iunie 2014 20:12:55
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>

#define max 100005
using namespace std;
int n,m;
int aib[max];
int a[max];
int zero(int x)
{
    int aux=x xor (x-1);
    aux=x & aux;
    int k=0;
    while(aux)
    {
        aux/=2;
        k++;
    }
    return k-1;
}
void update(int x,int i)
{
    for(int j=i;j<=n;)
    {   aib[j]+=x;
        j+=1 << zero(j);
    }
}
int suma(int y);
void citire()
{
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
        {   int x;
            scanf("%d ",&a[i]);
            update(a[i],i);
        }
    for(int i=1;i<=m;i++)
    {   int x;
        scanf("%d ",&x);
        if(x==0)
        {
            int y,z;
            scanf("%d %d ",&y,&z);
                a[y]+=z;
                update(y,z);
        }
        else if(x==1)
        {
            int y,z;
            scanf("%d %d",&y,&z);
            int k=suma(z);
            k-=suma(y);
            k+=a[y];
            printf("%d ",k);
        }
        else if(x==2)
        {
            int y;
            scanf("%d ",&y);
        }
    }
}
int suma(int y)
{   int aux=0;
   for(int i=y;i>=1;)
   {
       aux+=aib[i];
       i-=1 << zero(i);
   }
   return aux;
}
int main()
{
    freopen("aib.in","r",stdin);
    //freopen("aib.out","w",stdout);
    citire();
    return 0;
}