Cod sursa(job #1264543)

Utilizator cipriancxFMI - gr143 Timofte Ciprian cipriancx Data 15 noiembrie 2014 21:53:44
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

int n,m,c[100001];
int zero(int n)
{
    int a=0;
    while((n & (1<<a))!=(1<<a))a++;
    return a;
}
void actualizare(int poz, int val)
{
c[poz]+=val;
int k=zero(poz);
while(poz<=n)
{
   poz+=(1<<k);
   c[poz]+=val;
k=zero(poz);

}

}

int interogare(int dr)
{int sum=0;
while(dr)
{
   sum+=c[dr];
   dr=(dr&(dr-1));
}
return sum;
}
int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
   //freopen("a.in","r",stdin);
   //freopen("a.out","w",stdout);
int *v=(int *)calloc(n,4);

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

//construim c
for(int i=1; i<=n; i++)
{
  int k=zero(i);
  for(int j=i-(1<<k)+1; j<=i; j++)c[i]+=v[j];
}
//am construit c-ul
free(v);
int x,y,z;
for(int i=1; i<=m; i++)
{
  scanf("%d ",&x);
  if(x!=2)scanf("%d %d ",&y,&z);else scanf("%d ",&y);
if(x==0)actualizare(y,z);
if(x==1){ if(y==1)printf("%d \n",interogare(z)); else printf("%d \n",interogare(z)-interogare(y-1));   }
if(x==2){ for(int j=1; j<=n; j++)if(interogare(j)==y){printf("%d \n",j); break; }  }



}



    return 0;
}