Pagini recente » Cod sursa (job #456554) | Cod sursa (job #315329) | Cod sursa (job #2977974) | Cod sursa (job #715670) | Cod sursa (job #2717375)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
long long n, m, aib[100005];
void update(long long x, long long pos) {
for(long long i = pos; i <= n; i += (i&(-i)))
aib[i] += x;
}
long long query(long long pos) {
long long sum = 0;
for(long long i = pos; i > 0; i -= (i&(-i)))
sum += aib[i];
return sum;
}
long long bs(long long x) {
long long l = 1, r = n, ans = -1;
while(l <= r) {
long long m = l+(r-l)/2;
long long q = query(m);
if(q >= x) {
ans = m;
r = m-1;
} else {
l = m+1;
}
}
if(ans == -1 || query(ans) == x) return ans;
return -1;
}
int main() {
fin >> n >> m;
for(long long i = 1; i <= n; i++) {
long long a;
fin >> a;
update(a, i);
}
while(m--) {
long long t, a, b;
fin >> t;
if(t == 0) {
fin >> a >> b;
update(b, a);
} else if(t == 1) {
fin >> a >> b;
fout << query(b) - query(a-1) << '\n';
} else {
fin >> a;
fout << bs(a) << '\n';
}
}
}