Pagini recente » Cod sursa (job #2561582) | Cod sursa (job #237303) | Cod sursa (job #799826) | Cod sursa (job #3179476) | Cod sursa (job #2957991)
#include <bits/stdc++.h>
using namespace std;
const int nmax=100000;
int lsb(int x) {return x&(-x);}
struct AIB {
int aib[nmax+1],n;
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 search(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;
return ans;
}
};
int main() {
ifstream cin("aib.in");
ofstream cout("aib.out");
int n,q,x,y,t;
AIB aib;
cin>>n>>q;
aib.n=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.search(x)<<"\n";
}
}
return 0;
}