Pagini recente » Cod sursa (job #965663) | Cod sursa (job #2204632) | Cod sursa (job #1101377) | Cod sursa (job #1243681) | Cod sursa (job #3267156)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int n, queries;
int arr[100005], aib[100005];
void update (int x, int value){
for (int i=x; i<=n; i+=(i&-i)){
aib[i] += value;
}
}
int query (int x){
int rez = 0;
for (int i=x; i>0; i-=(i&-i)){
rez += aib[i];
}
return rez;
}
long long special (long long sum){
long long mySum = 0, idx = 1;
while (1){
while (mySum + aib[idx+(idx&-idx)] <= sum){
idx += (idx&-idx);
if (idx == n)
break;
if (idx > n)
return -1;
}
mySum += aib[idx];
if (mySum == sum)
return idx;
else if (mySum > sum)
return -1;
idx++;
}
return -1;
}
int main (){
in >> n >> queries;
for (int i=1; i<=n; ++i){
in >> arr[i];
update(i, arr[i]);
}
int op, x, y;
long long sum;
for (int i=1; i<=queries; ++i){
in >> op;
if (op == 0){
in >> x >> y;
update(x, y);
}
if (op == 1){
in >> x >> y;
out << (query(y) - query(x-1)) << '\n';
}
if (op == 2){
in >> sum;
out << special(sum) << '\n';
}
}
return 0;
}