Pagini recente » Cod sursa (job #1206353) | Cod sursa (job #882630) | Cod sursa (job #1378960) | Cod sursa (job #3181145) | Cod sursa (job #3157517)
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
typedef long long ll;
#define lsb(x) ((x)&(-x))
class AIB{
vector<ll> v;
public:
AIB(ll n){v.resize(n+1);}
void addval(ll p,ll val=1){for(;p<v.size();p+=lsb(p))v[p]+=val;}
ll ask(ll p){ll rez=0;for(;p;p-=lsb(p))rez+=v[p];return rez;}
};
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll n,q,c,a,b,i,st,dr,mid,rez;
cin>>n>>q;
AIB aib(n);
for(i=0;i<n;i++)
{
cin>>a;
aib.addval(i+1,a);
}
while(q--)
{
cin>>c>>a;
switch(c)
{
case 0:
cin>>b;
aib.addval(a,b);
break;
case 1:
cin>>b;
cout<<aib.ask(b)-aib.ask(a-1)<<'\n';
break;
case 2:
st=1;
dr=n;
while(true)
{
if(st==dr)
{
if(aib.ask(st)<=a)rez=st;
break;
}
mid=(st+dr)/2;
if(aib.ask(mid)<=a)rez=mid,st=mid+1;
else dr=mid;
}
if(aib.ask(rez)==a)cout<<rez<<'\n';
else cout<<-1<<'\n';
break;
}
}
return 0;
}