Pagini recente » Cod sursa (job #2334386) | Cod sursa (job #1261230) | Cod sursa (job #290639) | Cod sursa (job #277425) | Cod sursa (job #1264545)
#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(100001,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;
}