Cod sursa(job #775769)

Utilizator ionut_blesneagIonut Blesneag ionut_blesneag Data 8 august 2012 20:54:12
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
/* Arbori indexati binar */

#include<stdio.h>

using namespace std;

int n,m;
int i,j,k,c;
int arb[100001];

void update(int poz, int val)
{int C=0;
while(poz<=n)
  {arb[poz]+=val;
   while(!(poz & (1<<C)))   C++;
   poz+=(1<<C);
   C+=1;
   }
}

int sumr(int poz)
{int C=0, S=0;
 while(poz>0)
   {S+=arb[poz];
    while(!(poz & (1<<C))) C++;
     poz-=(1<<C);
     C+=1;
    }
 return S;   
}

int search(int val)
{int C;
 int suma=0;
 int start=0;
 while(suma!=val)
 {C=0; 
 while(true)
   {
    if(start+(1<<C)>n ||(suma+arb[start+(1<<C)])>val)
       break;
    C++;}
 C--;
 suma+=arb[start+(1<<C)];
 start+=(1<<C);}
 
 return start;
}

int main()
{int x,y,z;

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

scanf("%d %d",&n,&m);
for(i=1; i<=n; i++)
  {scanf("%d",&c);
   update(i,c);}
for(i=1; i<=m; i++)
  {scanf("%d",&k);
   if(k==0)
    {scanf("%d %d",&x,&y);
     update(x,y);}
   if(k==1)
    {scanf("%d %d",&x,&y);
     z=sumr(y)-sumr(x-1);
     printf("%d\n",z);
    }
   if(k==2)
    {scanf("%d",&x);
    z=0;
    z=search(x);
    printf("%d\n",z);}
}  
return 0;
}