Pagini recente » Cod sursa (job #63898) | Cod sursa (job #2191680) | Cod sursa (job #635944) | Cod sursa (job #1278707) | Cod sursa (job #2222563)
#include <fstream>
std::ifstream cin("aib.in");
std::ofstream cout("aib.out");
#define maxn 100010
int arb[maxn];
int N,M,T;
void update(int,int);
int query(int);
int searchxd(int);
int main()
{
int x,y;
cin>>N>>M;
for(int i=1;i<=N;i++){
cin>>T;
update(i,T);
}
while(M){
M--;
cin>>T;
if(T<2){
cin>>x>>y;
if(T) cout<<query(y)-query(x-1)<<'\n';
else update(x,y);
}
else{
cin>>x;
cout<<searchxd(x)<<'/n';
}
}
return 0;
}
void update(int poz,int val){
int C=0;
while(poz<=N){
arb[poz]+=val;
while(!(poz&(1<<C))) C++;
poz+=1<<C;
C+=1;
}
}
int query(int poz){
int C=0,S=0;
while(poz>0){
S+=arb[poz];
while(!(poz&(1<<C))) C++;
poz-=1<<C;
C+=1;
}
return S;
}
int searchxd(int val){
int step,i=0;
for(step=1;step<N;step<<=1);
for(i=0;step;step>>=1){
if(i+step<=N)
{
if(val>=arb[i+step])
{
i+=step,
val-=arb[i];
if(!val) return i;
}
}
}
return -1;
}