Pagini recente » Cod sursa (job #1846607) | Cod sursa (job #2318411) | Cod sursa (job #336877) | Cod sursa (job #1958289) | Cod sursa (job #1156223)
#include <fstream>
using namespace std;
ifstream in ("aib.in");
ofstream out ("aib.out");
const int N = 100005;
int n, operatii, step;
int aib[N];
int query(int p)
{
int sum = 0;
while (p != 0) {
sum += aib[p];
p -= (p & -p);
}
return sum;
}
void update (int p, int val)
{
while (p <= n) {
aib[p] += val;
p += (p & -p);
}
}
void solve (int operatie, int a, int b)
{
switch (operatie) {
case 0: {
update (a, b);
break;
}
case 1: {
int sum_a = query(a-1);
int sum_b = query(b);
out << sum_b - sum_a << "\n";
break;
}
case 2: {
int i = 0, pas = step;
while (pas != 0) {
if (i + pas <= n and aib[i + pas] <= a) {
a -= aib[i + pas];
i += pas;
}
pas /= 2;
}
if (a == 0) {
out << i << "\n";
} else {
out << "-1\n";
}
break;
}
default:
break;
}
}
int main()
{
in >> n >> operatii;
for (int i = 1; i <= n; ++i) {
int x;
in >> x;
update(i, x);
}
for (step = 1; step <= n; step <<= 1);
for (int i = 1; i <= operatii; ++i) {
int operatie, a = 0, b = 0;
in >> operatie;
if (operatie == 2) {
in >> a;
solve(operatie, a, b);
} else {
in >> a >> b;
solve(operatie, a, b);
}
}
return 0;
}