Pagini recente » Cod sursa (job #740417) | Cod sursa (job #1433946) | Cod sursa (job #2516549) | Cod sursa (job #1766433) | Cod sursa (job #181937)
Cod sursa(job #181937)
//arbori indexati binar
#include<stdio.h>
unsigned int a[100010];
unsigned int c[100010];
unsigned int n,p1,p2,p3,i,m,tsk3;
unsigned int Sum(unsigned int aux)
{
unsigned int sum1=0;
unsigned int k;
while (aux!=0)
{
sum1+=c[aux];
k=0;
while (((1<<k)&aux)==0) k++;
aux-=(1<<k);
}
return sum1;
}
unsigned int Query2(unsigned int val)
{
unsigned int mij,aux,k;
unsigned int st=1;
unsigned int dr=n;
while (st<=dr)
{
mij=(st+dr)/2;
aux=Sum(mij);
if (aux<val) st=mij+1;
else
if (aux>val) dr=mij-1;
else
return mij;
}
return 0;
}
unsigned int Query1(unsigned int poz1,unsigned int poz2)
{
unsigned int k;
unsigned int aux=poz1-1;
unsigned int aux2=poz2;
unsigned int sum1=0,sum2=0;
while (aux!=0)
{
sum1+=c[aux];
k=0;
while (((1<<k)&aux)==0) k++;
aux-=(1<<k);
}
while (aux2!=0)
{
sum2+=c[aux2];
k=0;
while (((1<<k)&aux2)==0) k++;
aux2-=(1<<k);
}
return sum2-sum1;
}
unsigned int Update(unsigned int poz, unsigned int val)
{
unsigned int k;
while (poz<=n)
{
c[poz]+=val;
k=0;
while (((1<<k)&poz)==0) k++;
poz+=(1<<k);
}
return 0;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
Update(i,a[i]);
}
for(i=1;i<=m;i++)
{
scanf("%d",&p1);
if (p1==0)
{
scanf("%d %d",&p2,&p3);
Update(p2,p3);
}
else
if (p1==1)
{
scanf("%d %d",&p2,&p3);
printf("%d\n",Query1(p2,p3));
}
else
if (p1==2)
{
scanf("%d",&p2);
tsk3=Query2(p2);
if (tsk3!=0) printf("%d\n",tsk3);
else printf("-1\n");
}
}
return 0;
}