Pagini recente » Profil EugenStoica | Cod sursa (job #1680868) | Cod sursa (job #2078201) | Cod sursa (job #725543) | Cod sursa (job #2064868)
#include <fstream>
#define p2(x) (x ^ (x-1)) & x
using namespace std;
int n, operatii, a[100001], pas_init;
void adauga (int poz, int val) {
for (int i = poz; i <= n; i += p2(i))
a[i] += val;
}
int suma (int poz) {
int s = 0;
for (int i = poz; i > 0; i -= p2(i))
s += a[i];
return s;
}
int cauta (int val) {
int pas = pas_init, i;
for (i = 0; pas; pas >>= 1)
if (i+pas <= n and a[i+pas] <= val) {
i += pas; val -= a[i];
if (!val)
return i;
}
return -1;
}
int main () {
int x, o, a, b;
ifstream fi("aib.in");
ofstream fo("aib.out");
fi >> n >> operatii;
for (pas_init = 1; pas_init < n; pas_init <<= 1);
for (int i = 1; i <= n; i++)
fi >> x, adauga(i, x);
for (int i = 1; i <= operatii; i++) {
fi >> o >> a;
if (o == 0)
fi >> b, adauga(a, b);
else
if (o == 1)
fi >> b, fo << suma(b)-suma(a-1) << '\n';
else
fo << cauta(a) << '\n';
}
return 0;
}