Pagini recente » Cod sursa (job #2647912) | Cod sursa (job #817899) | Cod sursa (job #1577) | Cod sursa (job #1264083) | Cod sursa (job #1142038)
#include <cstdio>
#define ub(x) (x&(-x))
using namespace std;
int i,x,y,a,b,aib[100004],n,m,mijloc,s,val;
void d (int x, int y)
{
int i;
for (i=y;i<=n;i+=ub(i))
aib[i]+=x;
}
int e (int x)
{
int q,i;
q=0;
for (i=x;i>0;i-=ub(i))
q+=aib[i];
return q;
}
int cautare (int x)
{
int st,dr,mijloc;
st=1;
dr=n;
while (st<=dr)
{
mijloc=(st+dr)/2;
if (e(mijloc)==x)
return mijloc;
else if (e(mijloc)>x)
dr=mijloc-1;
else
st=mijloc+1;
}
return -1;
}
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", &x);
d (x,i);
}
for (i=1;i<=m;i++)
{
scanf ("%d", &x);
if (x==0)
{
scanf ("%d %d", &a, &b);
d(b,a);
}
else if (x==1)
{
scanf("%d %d", &a, &b);
printf ("%d\n", e(b)-e(a-1));
}
else
{
scanf ("%d", &val);
printf ("%d\n", cautare(val));
}
}
return 0;
}