Pagini recente » Cod sursa (job #1698998) | Cod sursa (job #1402158) | Cod sursa (job #3127970) | Cod sursa (job #1771770) | Cod sursa (job #3177031)
#include <bits/stdc++.h>
std::ifstream f("aib.in");
std::ofstream g("aib.out");
const int size=100001;
int n, q;
int a[size+1],v[size+1];
inline int lsb(int x){
return x&(-x);
}
void build(){
for(int i=1;i<=n;i++){
a[i]+=v[i];
if(i+lsb(i)<=n){
a[i+lsb(i)]+=a[i];
}
}
}
void update(int p, int v){
while(p<=n){
a[p]+=v;
p+=lsb(p);
}
}
int query(int p){
int r=0;
while(p){
r+=a[p];
p-=lsb(p);
}
return r;
}
int search(int v){
int st=1, dr=n;
while(st<dr){
int m=(st+dr)/2;
if(query(m)<v)st=m+1;
else dr=m;
}
return dr;
}
int main(){
f>>n>>q;
for(int i=1;i<=n;i++)
f>>v[i];
build();
while(q--){
int t, a, b;
f>>t>>a;
switch(t){
case 0:
f>>b;
update(a,b);
break;
case 1:
f>>b;
g<<query(b)-query(a-1)<<'\n';
break;
case 2:
g<<search(a)<<'\n';
break;
}
}
return 0;
}