Pagini recente » Cod sursa (job #2935008) | Cod sursa (job #1983862) | Cod sursa (job #1589676) | Cod sursa (job #1957775) | Cod sursa (job #2449711)
#include <bits/stdc++.h>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int NMAX=100002;
#define zeros(x) x&-x
int aib[NMAX],n,m;
void update(int poz,int val){
for(poz;poz<=n;poz+=zeros(poz))
aib[poz]+=val;
}
int compute(int poz){
int sum=0;
for(poz;poz;poz-=zeros(poz))
sum+=aib[poz];
return sum;
}
int Find(int val){
int bit,poz=0,rez;
for(bit=1;bit<n;bit<<=1);
while(bit){
int cpoz=poz+bit;
bit>>=1;
if(cpoz>n)
continue;
if(val==aib[cpoz]){
return cpoz;
}
else if(aib[cpoz]<val){
val-=aib[cpoz];
poz=cpoz;
}
}
if(val)
return -1;
else
return 0;
}
int main()
{
in>>n>>m;
int val,tip,x,y;
for(int i=1;i<=n;i++){
in>>val;
update(i,val);
}
for(int i=1;i<=m;i++){
in>>tip;
if(tip==0){
in>>x>>y;
update(x,y);
}
else if(tip==1){
in>>x>>y;
out<<compute(y)-compute(x-1)<<'\n';
}
else{
in>>x;
out<<Find(x)<<'\n';
}
}
return 0;
}