Pagini recente » Cod sursa (job #1736165) | Cod sursa (job #2717085) | Cod sursa (job #162617) | Cod sursa (job #271544) | Cod sursa (job #1074976)
#include <cstdio>
const int Q=100001;
int v[Q],arb[Q];
int n,m;
void update(int k, int val)
{
int act=k;
while(act<=n)
{
arb[act]+=val;
act+=act&(-act);
}
}
int resp(int k)
{
int rez=0;
while(k>0)
{
rez+=arb[k];
k-=k&(-k);
}
return rez;
}
int binarizare(int val)
{
int st=1, dr=n,mj,act;
while(st<dr-1)
{
mj=(st+dr)/2;
act=resp(mj);
if(act>val )
dr=mj;
if(act <val )
st=mj;
if(act == val)
return mj;
}
mj=(st+dr)/2;
act=resp(mj);
if(act>val )
dr=mj;
if(act <val )
st=mj;
if(act == val)
return mj;
act=resp(mj+1);
if(act == val)
return mj+1;
return -1;
}
int binarizare2(int val)
{
int st=1, dr=n,mj,act;
while(st!=dr-1)
{
mj=(st+dr+1)/2;
act=resp(mj);
if(act>val )
dr=mj;
if(act <val )
st=mj;
if(act == val)
return mj;
}
mj=(st+dr+1)/2;
act=resp(mj);
if(act>val )
dr=mj;
if(act <val )
st=mj;
if(act == val)
return mj;
act=resp(st);
if(act==val)
return st;
return -1;
}
int bin(int x)
{
int i=0, pas=1<<x;
while(pas!=0)
{
if(i+pas<=n && arb[i+pas]<=x )
{
x-=arb[i+pas];
i+=pas;
}
pas/=2;
}
return i;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
{
scanf("%d",&v[i]);
update(i,v[i]);
}
int op,a,b;
for(int i=1; i<=m; i++)
{
scanf("%d",&op);
if(op==0)
{
scanf("%d%d",&a,&b);
v[a]+=b;
update(a,b);
}
if(op==1)
{
scanf("%d%d",&a,&b);
printf("%d\n",resp(b)-resp(a-1));
}
if(op==2)
{
scanf("%d",&a);
printf("%d\n",bin(a));
}
}
return 0;
}