Pagini recente » Rating Tanislav Alexia (AlexiaT) | Borderou de evaluare (job #1330892) | Cod sursa (job #2853736) | Cod sursa (job #1931513) | Cod sursa (job #901713)
Cod sursa(job #901713)
#include<cstdio>
#define powZero(x) (x^(x-1))&x
#define INF 100001
int n,m;
long long aib[INF];
void add(int poz,int val)
{
for(int i=poz;i<=n;i+=powZero(i))
aib[i]+=val;
}
long long sum(int poz)
{
int ret=0;
for(int i=poz;i>=1;i-=powZero(i))
ret+=aib[i];
return ret;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
{
int x;
scanf("%d",&x);
add(i,x);
}
for(int i=1;i<=m;++i)
{
int c,a,b;
scanf("%d",&c);
if(c==0){scanf("%d%d",&a,&b);add(a,b);}
if(c==1){scanf("%d%d",&a,&b);printf("%d\n",sum(b)-sum(a-1));}
if(c==2)
{
scanf("%d",&a);
int st=1,dr=n,m,s;
while(st<=dr)
{
m=(st+dr)/2;
s=sum(m);
if(s==a){printf("%d\n",m);break;}
if(s<a)st=m+1;
if(s>a)dr=m;
}
if(s!=a)printf("-1\n");
}
}
return 0;
}