Pagini recente » Cod sursa (job #2487334) | Cod sursa (job #1362676) | Rating cont de incercari (Florin_Robert) | Cod sursa (job #1286883) | Cod sursa (job #2182690)
#include <cstdio>
using namespace std;
int m , n;
int v[100005];
long long sp[100005];
long long aib[100005];
void update(int poz,int val)
{
for(;poz<=m;poz+=(poz&-poz))
aib[poz]+=val;
}
int query(int poz)
{
int s=0;
for(;poz>0;poz-=(poz&-poz))s+=aib[poz];
return s;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
int i;
scanf("%d%d",&m,&n);
for(i=1;i<=m;i++)
{
scanf("%d",&v[i]);
sp[i]=sp[i-1]+v[i];
}
for(i=1;i<=m;i++)
{
int cp=i;
aib[i]=sp[i]-sp[i-(cp&-cp)];
}
int val1,a,b;
for(i=1;i<=n;i++)
{
scanf("%d",&val1);
if(val1==0)
{
scanf("%d%d",&a,&b);
update(a,b);
continue;
}
if(val1==1)
{
scanf("%d%d",&a,&b);
int s1=query(b),s2=query(a-1);
printf("%d\n",s1-s2);
continue;
}
scanf("%d",&a);
int st=1,dr=m,f=0;
while(st<=dr)
{
int med=(st+dr)/2;
int s1=query(med);
if(s1==a)
{
printf("%d\n",med);
f=1;
break;
}
if(s1>a)dr=med-1;
else
st=med+1;
}
if(f==0)
{
printf("-1\n");
continue;
}
}
return 0;
}