Pagini recente » Cod sursa (job #3038359) | Cod sursa (job #228996) | Cod sursa (job #1311907) | Cod sursa (job #710493) | Cod sursa (job #2884375)
#include <bits/stdc++.h>
using namespace std;
long long v[200005],aib[200005],n;
long long lsb(long long nod)
{
long long k=nod&(-nod);
return k;
}
void update(long long nod,long long val)
{
do
{
aib[nod]+=val;
nod+=lsb(nod);
}
while(nod<=n);
}
long long querry1(long long start,long long finish)
{
long long s=0;
while(finish)
{
s+=aib[finish];
finish-=lsb(finish);
}
start-=1;
while(start)
{
s-=aib[start];
start-=lsb(start);
}
return s;
}
long long querry2(long long val)
{
long long last=-1,st=0,sum=0;
long long put=1;
while(put<=n)
{
put=put*2;
}
put/=2;
while(put)
{
if(put+st<=n)
{
if(sum+aib[put+st]>=val)
{
if(sum+aib[put+st]==val)
{
last=put+st;
}
}
else
{
sum+=aib[put+st];
st+=put;
}
}
put/=2;
}
return last;
}
int main()
{
ifstream cin("aib.in");
ofstream cout("aib.out");
long long m;
cin>>n>>m;
for(long long i=1; i<=n; i++)
{
cin>>v[i];
update(i,v[i]);
}
long long t,a,b;
for(long long i=1; i<=m; i++)
{
cin>>t;
if(t==0)
{
cin>>a>>b;
update(a,b);
}
else
{
if(t==1)
{
cin>>a>>b;
cout<<querry1(a,b)<<"\n";
}
else
{
cin>>a;
cout<<querry2(a)<<"\n";
}
}
}
return 0;
}