Pagini recente » Cod sursa (job #2687798) | Cod sursa (job #471109) | Cod sursa (job #114741) | Cod sursa (job #1055731) | Cod sursa (job #2439938)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream is("aib.in");
ofstream os("aib.out");
int n;
vector<int> aib;
void Update(const int pos, const int val) {
for (int i = pos; i <= n; i += (i & -i)) {
aib[i] += val;
}
}
int Sum(const int pos) {
int sum = 0;
for (int i = pos; i; i -= (i & -i)) {
sum += aib[i];
}
return sum;
}
int main() {
int m;
is >> n >> m;
aib = vector<int>(n + 1, 0);
int val;
for (int i = 1; i <= n; ++i) {
is >> val;
Update(i, val);
}
int type, x, y;
while (m--) {
is >> type >> x;
switch (type) {
case 0:
{
is >> y;
Update(x, y);
break;
}
case 1:
{
is >> y;
const int sum = Sum(y) - Sum(x - 1);
os << sum << "\n";
break;
}
default:
{
int st = 1, dr = n, sum, md;
do {
md = st + ((dr - st) >> 1);
sum = Sum(md);
if (sum == x) {
break;
}
if (sum > x) {
dr = md - 1;
} else {
st = md + 1;
}
} while (st <= dr);
if (sum != x) {
sum = Sum(st);
md = st;
}
os << (sum == x ? md : -1) << "\n";
break;
}
}
}
is.close();
os.close();
return 0;
}