Pagini recente » Clasament ret1 | Cod sursa (job #2921258)
#include<bits/stdc++.h>
#define int long long
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,m,v[100005],aib[100005],power;
void update(int poz, int val)
{
int i;
for(i=poz;i<=n;i+=(i&-i))
{
aib[i]+=val;
}
}
int querysum(int poz)
{
int sol=0,i;
for(i=poz;i>=1;i-=(i&-i))
sol+=aib[i];
return sol;
}
int op2(int s)
{
int put=power,ok=0,i=0;
while(put>=1)
{
if(aib[i+put]==s)
ok=1;
if(aib[i+put]<s)
{
s-=aib[i+put];
i+=put;
}
put/=2;
while(put>=1 && i+put>n)
put/=2;
}
if(ok==1)
return i+1;
return -1;
}
signed main()
{
int i,j,tip,a,b,poz,val;
f>>n>>m;
for(i=1;i<=n;i++)
{
f>>v[i];
update(i,v[i]);
}
power=1;
while(power<=n)
power*=2;
power/=2;
for(i=1;i<=m;i++)
{
f>>tip;
if(tip==0)
{
f>>poz>>val;
update(poz,val);
}
else
if(tip==1)
{
f>>a>>b;
g<<querysum(b)-querysum(a-1)<<'\n';
}
else
{
f>>a;
g<<op2(a)<<'\n';
}
}
return 0;
}