Pagini recente » Cod sursa (job #3364040) | Cod sursa (job #3364175) | Cod sursa (job #3364217) | Cod sursa (job #3364080) | Cod sursa (job #3363340)
#include <bits/stdc++.h>
using namespace std;
#define lsb(x) (x & (-x))
const int max_size = 1e5 + 1;
int n, q, op, x, y;
int aib[max_size]; // [x-lsb(x)+1, x]
void upd(int poz, int val)
{
for(int i=poz; i<=n;i+=lsb(i)){
aib[i] += val;
}
}
int query(int poz){ // [1, poz]
int ans=0;
for(int i=poz;i>=1;i-=lsb(i)){
ans+=aib[i];
}
return ans;
}
int cb(int x){
int e=0;
while((1<<(e+1)) <= n) ++e;
int st=0;
while(e>=0){
if(st + (1<<e) <= n && aib[st + (1<<e)]<x){
st +=(1<<e);
x-=aib[st];
}
--e;
}
++st;
if(st==n+1 || query(st)-query(st-1)!=x) return -1;
return st;
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> q;
for (int i = 1; i <= n; ++i)
{
cin >> x;
upd(i, x);
}
while(q--){
cin>>op;
if(op==2){
cin>>x;
cout<<cb(x)<<'\n';
}
else{
cin>>x>>y;
if(op==0){
upd(x, y);
}
else{
cout<<query(y)-query(x-1)<<'\n';
}
}
}
return 0;
}