Pagini recente » Monitorul de evaluare | Cod sursa (job #484443) | Cod sursa (job #73721) | Monitorul de evaluare | Cod sursa (job #1583856)
#include<cstdio>
#define lsb(x) ((x)&(-x))
const int NMAX=100001;
int aib[NMAX];
int N;
void update(int pos,int val)
{
for(;pos<=N;pos+=lsb(pos))
aib[pos]+=val;
}
int query(int pos)
{
int S=0;
for(;pos;pos-=lsb(pos))
S+=aib[pos];
return S;
}
int query(int x,int y)
{
return query(y)-query(x-1);
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
int n,m;
scanf("%d %d ",&n,&m);
N=n;
for(int i=1;i<=n;i++)
{
int x;
scanf("%d ",&x);
update(i,x);
}
for(int i=1;i<=m;i++)
{
int tip;
scanf("%d ",&tip);
switch(tip)
{
case 0:
{
int a,b;
scanf("%d %d ",&a,&b);
update(a,b);
break;
}
case 1:
{
int a,b;
scanf("%d %d ",&a,&b);
printf("%d\n",query(a,b));
break;
}
case 2:
{
int a;
scanf("%d ",&a);
int st=1,dr=n,rasp=n+1;
while(st<=dr)
{
int mij=(st+dr)/2;
if(query(mij)<a)
st=mij+1;
else
{
rasp=mij;
dr=mij-1;
}
}
if(query(rasp)==a)
printf("%d\n",rasp);
else
printf("-1\n");
}
}
}
return 0;
}