Pagini recente » Cod sursa (job #2002174) | Cod sursa (job #2934856) | Cod sursa (job #2054664) | Cod sursa (job #2021081) | Cod sursa (job #2449714)
#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,i;
for(bit=1;bit<n;bit<<=1);
for( i=0;bit;bit>>=1){
if(i+bit<=n && aib[i+bit]<=val){
val-=aib[i+bit];
i+=bit;
}
}
if(val)
return -1;
return i;
}
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;
if(!x){
out<<-1<<'\n';
continue;
}
out<<Find(x)<<'\n';
}
}
return 0;
}