Pagini recente » Cod sursa (job #468313) | Cod sursa (job #2999779) | Cod sursa (job #619492) | Cod sursa (job #1437716) | Cod sursa (job #1311615)
#include <fstream>
#include <vector>
std::vector<unsigned> tree;
unsigned n;
unsigned maxbit;
void add(unsigned pos, unsigned val){
while(pos<=n){
tree[pos]+=val;
pos+= pos&(-pos);
}
}
unsigned get(unsigned pos){
unsigned sum=0;
while(pos>0){
sum+=tree[pos];
pos&=pos-1;
}
return sum;
}
int find(unsigned val){
if(val==0) return -1;
unsigned i=0,t;
for(unsigned bitmask=maxbit;bitmask;bitmask>>=1){
t=i+bitmask;
if(t<=n&&val>=tree[t]){
val-=tree[t];
i=t;
if(val==0) return t;
}
}
if(val==0) return i;
return -1;
}
int main(){
std::ifstream fin("aib.in");
std::ofstream fout("aib.out");
unsigned m;
fin>>n>>m;
tree.resize(n+1,0);
maxbit=1;
while(n>=maxbit) maxbit<<=1;
maxbit>>=1;
for(unsigned i=1;i<=n;++i){
unsigned x; fin>>x;
add(i,x);
}
for(unsigned i=0;i<m;++i){
char c; unsigned a,b;
fin>>c;
switch(c){
case '0': fin>>a>>b; add(a,b); break;
case '1': fin>>a>>b; fout<<get(b)-get(a-1)<<'\n'; break;
case '2': fin>>a; fout<<find(a)<<'\n'; break;
}
}
}