Pagini recente » Cod sursa (job #136853) | Cod sursa (job #3201512) | Cod sursa (job #1051981) | Cod sursa (job #1693526) | Cod sursa (job #1090966)
#include <iostream>
#include <fstream>
using namespace std;
#define MAXN 100005
#define zero(x) (x ^ (x - 1) & x)
ifstream f("aib.in");
ofstream g("aib.out");
int n;
int aib[MAXN];
void update(int ind, int val)
{
while (ind <= n) {
aib[ind] += val;
ind += zero(ind);
}
}
int query(int ind)
{
int s = 0;
while (ind > 0) {
s += aib[ind];
ind -= zero(ind);
}
return s;
}
int search(int sum)
{
int st = 1, dr = n;
while (st <= dr) {
int mij = (st + dr) / 2;
int nr = query(mij);
if (nr == sum) {
return mij;
}
if (nr < sum) {
st = mij + 1;
} else {
dr = mij - 1;
}
}
return -1;
}
int main()
{
int m;
f >> n >> m;
int s = 0;
for (int i = 1; i <= n; i++) {
int x;
f >> x;
update(i, x);
s += x;
}
for (int i = 1; i <= m; i++) {
int op, a, b;
f >> op >> a;
switch(op) {
case 0:
f >> b;
update(a, b);
break;
case 1:
f >> b;
g << query(b) - query(a - 1) << '\n';
break;
case 2:
g << search(a) << '\n';
}
}
return 0;
}