Pagini recente » Cod sursa (job #2197659) | Cod sursa (job #2928539) | Rating Georgescu Razvan (gerazvan) | Cod sursa (job #899050) | Cod sursa (job #329495)
Cod sursa(job #329495)
#include <stdio.h>
#define DIM 100005
int aib[DIM];
int n,m;
int lsb (int x)
{
return x&(x-1)^x;
}
void update (int poz,int val)
{
for ( ; poz<=n; poz+=lsb (poz))
aib[poz]+=val;
}
void read ()
{
int i,x;
scanf ("%d%D",&n,&m);
for (i=1; i<=n; ++i)
{
scanf ("%d",&x);
update (i,x);
}
}
int query (int poz)
{
int sum;
for (sum=0; poz; poz-=lsb (poz))
sum+=aib[poz];
return sum;
}
int cbin (int val)
{
int st,dr,mij,nr;
for (st=1, dr=n; st<=dr; )
{
mij=(st+dr)/2;
nr=query (mij);
if (nr==val)
return mij;
else if (nr<val)
st=mij+1;
else
dr=mij-1;
}
return -1;
}
void solve ()
{
int i,cod,x,y;
for (i=1; i<=m; ++i)
{
scanf ("%d",&cod);
if (cod==0)
{
scanf ("%d%d",&x,&y);
update (x,y);
}
else if (cod==1)
{
scanf ("%d%d",&x,&y);
printf ("%d\n",query (y)-query (x-1));
}
else if (cod==2)
{
scanf ("%d",&x);
printf ("%d\n",cbin (x));
}
}
}
int main ()
{
freopen ("aib.in","r",stdin);
freopen ("aib.out","w",stdout);
read ();
solve ();
return 0;
}