Pagini recente » Cod sursa (job #805643) | Cod sursa (job #2525875) | Cod sursa (job #2100356) | Cod sursa (job #1675738) | Cod sursa (job #2482886)
#include <bits/stdc++.h>
#define st first
#define nd second
#define pb push_back
#define NMAX 200005
#define ZERO(x) ((x^(x-1))&x)
using namespace std;
typedef long long ll;
int aib[100005], n, q, i, j, x, y, tip;
void fast()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
ios_base::sync_with_stdio(false);
cin.tie();
}
void upd(ll p, ll x)
{
for(int i=p;i<=n;i+=ZERO(i))
aib[i]+=x;
}
ll query(ll p)
{
ll ans=0;
while(p)
{
ans+=aib[p];
p-=ZERO(p);
}
return ans;
}
ll ok(ll m, ll key)
{
return query(m)<=key;
}
ll cautbin(ll l, ll key, ll r)
{
while(l!=r)
{
ll m=(l+r+1)/2;
if(ok(m,key))
l=m;
else r=m-1;
}
return l;
}
int main()
{
fast();
cin>>n>>q;
for(i=1;i<=n;i++)
{
cin>>x;
upd(i,x);
}
//for(i=1;i<=n;i++)
// cout<<aib[i]<<' ';
while(q)
{
q--;
cin>>tip;
if(tip==0)
{
cin>>i>>x;
upd(i,x);
}
else if(tip==1)
{
cin>>x>>y;
cout<<query(y)-query(x-1)<<'\n';
}
else
{
cin>>x;
if(query(cautbin(1,x,n))==x)
cout<<cautbin(1,x,n)<<'\n';
else cout<<"-1\n";
}
}
return 0;
}