Pagini recente » Cod sursa (job #1830269) | Cod sursa (job #1674325) | Cod sursa (job #417569) | Cod sursa (job #2217969) | Cod sursa (job #2866534)
#include <iostream>
#include <fstream>
#define NMAX 100005
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int N, M;
long s[NMAX];
int update(long poz, long val) {
for (int i = poz; i <= N; i += (i & -i)) {
s[i] += val;
}
}
int query(long poz) {
long sum = 0;
for (int i = poz; i > 0; i -= (i & -i)) {
sum += s[i];
}
return sum;
}
void read() {
fin >> N >> M;
int nr;
for (int i = 1; i <= N; ++i) {
fin >> nr;
update(i, nr);
}
}
int findK(long sum) {
int left = 1, right = N, mid;
while (left <= right) {
mid = (left + right) / 2;
if (query(mid) >= sum) {
right = mid - 1;
}
else {
left = mid + 1;
}
}
if (query(left) == sum)
return left;
return -1;
}
int main()
{
read();
int t;
long a, b;
for (int i = 0; i < M; ++i) {
fin >> t;
if (t == 0) {
fin >> a >> b;
update(a, b);
}
else if (t == 1) {
fin >> a >> b;
fout << query(b) - query(a - 1) << "\n";
}
else {
fin >> a;
fout << findK(a) << "\n";
}
}
return 0;
}