Cod sursa(job #609005)

Utilizator alexa_myparadiseAlexutzaaa alexa_myparadise Data 18 august 2011 23:28:20
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <cstdio>
 
int a[100100], v[100100], i,n,m,t,x,y,s,st,dr,s1,mm,s2;
bool ok;
 
int bit (int x)
{
return (-x)&x;
}
 
void adauga (int p, int x)
{
while (p<=n)
{
v[p]+=x;
p+=bit(p);
}
} 
int suma (int x)
{
int sum;
sum=0;
while (x>0)
{
sum+=v[x];
x-=bit(x);
}
return sum;
} 
int main()
{
freopen ("aib.in","r",stdin);
freopen ("aib.out","w",stdout);
scanf ("%d %d",&n,&mm);
for (i=1; i<=n; i++)
{
scanf ("%d",&a[i]);
}
for (i=1; i<=n; i++) adauga (i,a[i]);
for (i=1; i<=mm; i++)
{
scanf ("%d",&t);
if (t==0)
{
scanf ("%d %d",&x,&y);
adauga (x,y);
}
else if (t==1)
{
scanf ("%d %d",&x,&y);
s1=0;
s2=0;
x--;
s1=suma(y);
s2=suma(x);
s=s1-s2;
printf ("%d\n",s);
}
else if (t==2)
{
scanf ("%d",&x);
st=1;
dr=n;
ok=false;
while (st<=dr)
{
m=(st+dr)/2;
s1=0;
s1=suma(m);
if (s1==x)
{
printf ("%d\n",m);
st=n+1;
ok=true;
}
else if (s1>x) dr=m-1;
else st=m+1;
}
if (ok==false) printf ("-1\n");
}
}
return 0;
}