Pagini recente » Cod sursa (job #1582960) | Cod sursa (job #2374543) | Cod sursa (job #1112871) | Cod sursa (job #2028570) | Cod sursa (job #609005)
Cod sursa(job #609005)
#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;
}