Pagini recente » Cod sursa (job #2962593) | Cod sursa (job #1825738) | Cod sursa (job #2103511) | Cod sursa (job #294330) | Cod sursa (job #2916472)
#include <bits/stdc++.h>
#define L 100005
#define lsb(x) (x & (-x))
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int v[L], aib[L], n;
inline void update(int pos, int val){
for (; pos <= n; pos += lsb(pos))
aib[pos] += val;
}
inline int query(int pos){
int ret = 0;
for (; pos; pos -= lsb(pos))
ret += aib[pos];
return ret;
}
inline int cb(int sum){
int mid, best;
best = 0;
mid = 1;
while (mid <= n && lsb(mid)){
if (aib[mid] >= sum){
best = mid;
mid -= lsb(mid);
}
else
mid += lsb(mid);
}
if (mid > n || aib[best] != sum)
best = -1;
return best;
}
int main(){
int m, i, t, x, y;
fin >> n >> m;
for (i = 1; i <= n; i++){
fin >> v[i];
update(i, v[i]);
}
while (m--){
fin >> t >> x;
if (t == 0){
fin >> y;
update(x, y);
}
else if (t == 1){
fin >> y;
fout << query(y) - query(x - 1) << "\n";
}
else
fout << cb(x) << "\n";
}
return 0;
}