Pagini recente » Cod sursa (job #750626) | Cod sursa (job #724954) | Cod sursa (job #2264587) | Cod sursa (job #2197278) | Cod sursa (job #3175897)
#include <bits/stdc++.h>
#define lsb(x) x&(-x)
using namespace std;
const int nmax=100000;
struct AIB {
vector<int> aib;
int n;
AIB(int N) {
n=N;
aib.resize(n+1);
}
void update(int poz,int val) {
for(; poz<=n; poz+=lsb(poz))
aib[poz]+=val;
}
int queryPref(int poz) {
int s=0;
for(; poz>0; poz-=lsb(poz))
s+=aib[poz];
return s;
}
int query(int st,int dr) {
return queryPref(dr)-queryPref(st-1);
}
int binsearch(int x) {
int s=0,ans=0;
for(int i=24; i>=0; i--) {
if(ans+(1<<i)<=n && s+aib[ans+(1<<i)] < x) {
s+=aib[ans+(1<<i)];
ans+=(1<<i);
}
}
ans++;
if(ans>n || queryPref(ans)!=x)
return -1;
else
return ans;
}
};
int main() {
ifstream cin("aib.in");
ofstream cout("aib.out");
int n,q,x,y,t;
cin>>n>>q;
AIB aib(n);
for(int i=1; i<=n; i++) {
cin>>x;
aib.update(i,x);
}
for(int i=1; i<=q; i++) {
cin>>t>>x;
if(t==0) {
cin>>y;
aib.update(x,y);
} else if(t==1) {
cin>>y;
cout<<aib.query(x,y)<<"\n";
} else {
cout<<aib.binsearch(x)<<"\n";
}
}
return 0;
}