Pagini recente » Cod sursa (job #1234448) | Cod sursa (job #1549664) | Cod sursa (job #1148415) | Cod sursa (job #3177566) | Cod sursa (job #385775)
Cod sursa(job #385775)
#include<cstdio>
#define N 100001
int c[N],val,n,m,suma1,suma2,q,x,y;
int rez(int x)
{
suma1=0;
for (;x; x-=x^(x-1)&x)
suma1+=c[x];
return suma1;
}
int caut()
{
int p=1, u=n,m;
while (u!=p)
{
m=(u+p)>>1;
if (rez(m)<=x)
p=m+1;
else
u=m;
}
q=rez(p);
if (q>x)
--p;
if (rez(p)!=x)
return -1;
return p;
}
void update(int x, int val)
{
for (;x<=n; x+=x^(x-1)&x)
c[x]+=val;
}
void citire()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1; i<=n; ++i)
{
scanf("%d",&val);
update(i,val);
}
while (m--)
{
scanf("%d",&q);
if (!q)
{
scanf("%d%d",&x,&y);
for (;x<=n; x+=x^(x-1)&x)
c[x]+=y;
continue;
}
if (q==1)
{
scanf("%d%d",&x,&y);
suma1=0;suma2=0;
--x;
for (;x;x-=x^(x-1)&x)
suma1+=c[x];
for (;y;y-=y^(y-1)&y)
suma2+=c[y];
printf("%d\n",suma2-suma1);
continue;
}
scanf("%d",&x);
printf("%d\n",caut());
}
}
int main()
{
citire();
return 0;
}