Pagini recente » Cod sursa (job #2165896) | Cod sursa (job #275172) | Cod sursa (job #1361066) | Cod sursa (job #3292930) | Cod sursa (job #2755909)
#include<iostream>
#include<fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int mx=1e5+100;
int n,m;
long long tree[mx];
int lsb(int x){
return x&(-x);
}
long long query(int x){
long long total=0;
while(x){
total+=tree[x];
x-=lsb(x);
}
return total;
}
void update(int x,long long value){
while(x<=n){
tree[x]+=value;
x+=lsb(x);
}
}
long long interval(int l,int r){
long long a=query(r),b=0;
if(l>1){
b=query(l-1);
}
return a-b;
}
int lower_bound(long long x){
int l=1,r=n,mid;
long long aux;
while(l<r){
mid=(l+r)/2;
aux=query(mid);
if(x<=aux){
r=mid;
}
else{
l=mid+1;
}
}
if(query(l)==x)
return l;
return -1;
}
void read(){
in>>n>>m;
long long aux;
for(int i=1;i<=n;i++){
in>>aux;
update(i,aux);
}
}
void solve(){
int q;
long long a,b;
for(int i=0;i<m;i++){
in>>q;
if(q==0){
in>>a>>b;
update(a,b);
}
else if(q==1){
in>>a>>b;
out<<interval(a,b)<<'\n';
}
else{
in>>a;
out<<lower_bound(a)<<'\n';
}
}
}
int main(){
read();
solve();
return 0;
}