Pagini recente » Cod sursa (job #719228) | Cod sursa (job #517571) | Cod sursa (job #1758096) | Cod sursa (job #3281411) | Cod sursa (job #3177459)
#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 val){
int pos=0;
int step=1<<20;
int sum=0;
while(step){
if(pos+step<=n && sum+a[pos+step]<=val){
pos+=step;
sum+=a[pos];
}
step>>=1;
}
return pos;
}
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;
}