Pagini recente » Cod sursa (job #947200) | Cod sursa (job #2777913) | Cod sursa (job #2226658) | Cod sursa (job #145829) | Cod sursa (job #3177034)
#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, pas, s=0;
pas=1<<20;
while(pas){
if(pos+pas<=n && s+a[pos+pas]<val){
pos+=pas;
s+=a[pos];
}
pas>>=1;
}
pos++;
if(pos<=n && (query(pos)==val)) return pos;
return -1;
}
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;
}