Pagini recente » Monitorul de evaluare | Cod sursa (job #2295238) | Cod sursa (job #844745) | Cod sursa (job #812932) | Cod sursa (job #1213633)
#include<iostream>
using namespace std;
int aib[200001];
void update(int pos, int val, int n) {
while(pos <= n) {
aib[pos] += val;
pos += pos & -pos;
}
}
int query(int pos) {
int sum = 0;
while(pos > 0) {
sum += aib[pos];
pos -= pos & -pos;
}
return sum;
}
int binarySearch(int sum, int n) {
int poz = 1, pas, current = 0, ans = -1;
while(poz <= n) poz *= 2;
poz /= 2;
pas = poz;
while(pas > 0) {
pas /= 2;
if(current + aib[poz] <= sum) {
if(poz + pas <= n) {
ans = poz;
current += aib[poz];
poz += pas;
}
} else {
poz -= pas;
}
}
if(current == sum) return ans;
return -1;
}
int main() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int a, b, opt, n, m, i;
cin >> n >> m;
for(i = 1; i <= n; i++) {
cin >> a;
update(i, a, n);
}
for(i = 0; i < m; i++) {
cin >> opt;
if(opt == 0) {
cin >> a >> b;
update(a, b, n);
}
if(opt == 1) {
cin >> a >> b;
cout << query(b) - query(a-1) << "\n";
}
if(opt == 2) {
cin >> a;
cout << binarySearch(a, n) << "\n";
}
}
return 0;
}