Pagini recente » Cod sursa (job #2401482) | Cod sursa (job #2533540) | Cod sursa (job #2495169) | Cod sursa (job #1616524) | Cod sursa (job #3177831)
#include <bits/stdc++.h>
using namespace std;
ifstream in ("aib.in");
ofstream out("aib.out");
int n,m;
#define maxN 100000
int v[maxN+1],aib[maxN+1];
void update(int poz,int val){
while(poz<=n){
aib[poz]+=val;
poz=poz+(poz & (poz ^ (poz-1)));
}
}
int query(int poz){
int res=0;
while(poz>0){
res+=aib[poz];
poz=poz-(poz & (poz ^ (poz-1)));
}
return res;
}
int cautare_binara(int x) {
int res=0;
for(int i=17;i>=0;i--){
if((res+(1<<i))<=n && query(res+(1<<i))<x){
res+=(1<<i);
}
}
return res+1;
}
int main(){
in>>n>>m;
for(int i=1;i<=n;i++){
in>>v[i];
update(i,v[i]);
}
for(int i=1;i<=m;i++){
int type,x,y;
in>>type;
if(type==0){
in>>x>>y;
update(x,y);
}
else if(type==1){
in>>x>>y;
out<<query(y)-query(x-1)<<'\n';
}
else{
in>>x;
int res=cautare_binara(x);
if(res==n+1 || query(res)!=x){
out<<"-1"<<'\n';
}
else{
out<<res<<'\n';
}
}
}
}