Pagini recente » Cod sursa (job #2826069) | Cod sursa (job #1972953) | Cod sursa (job #596447) | Cod sursa (job #1818140) | Cod sursa (job #775769)
Cod sursa(job #775769)
/* 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;
}