Pagini recente » Cod sursa (job #267234) | Cod sursa (job #1445262) | Cod sursa (job #2454888) | Cod sursa (job #467405) | Cod sursa (job #1364471)
#include <iostream>
#include <fstream>
using namespace std;
int N,M,tree[100010];
int sum(int r){
int res=0;
while (r){
res+=tree[r];
r-=(r&-r);
}
return res;
}
int get_sum(int l,int r){
return sum(r)-sum(l-1);
}
void update(int ind, int val){
while (ind<=N){
tree[ind]+=val;
ind+=(ind&-ind);
}
}
int find_min(int sum){
int lg=0,p=0;
for (lg=0; (1<<(lg+1))<=N; lg++) ;
for (; lg>=0; lg--){
if (p+(1<<lg)<=N)
if (sum>=tree[p+(1<<lg)]){
p+=(1<<lg), sum-=tree[p];
if (!sum) return p;
}
}
return -1;
}
int main(){
ifstream fin("aib.in");
ofstream fout("aib.out");
fin >> N >> M;
int i,x,o,val;
for (i=1; i<=N; i++){
fin >> x; update(i,x);
}
for (i=1; i<=M; i++){
fin >> o >> x;
if (o==0){
fin >> val;
update(x,val);
}
else if (o==1){
fin >> val;
fout << get_sum(x,val) << "\n";
}
else fout << find_min(x) << "\n";
}
return 0;
}