Pagini recente » Cod sursa (job #1203971) | Cod sursa (job #1265788) | Cod sursa (job #2037762) | Cod sursa (job #1702525) | Cod sursa (job #3213548)
// Cu functie inline in loc de macro
// 100 p infoarena
#include <fstream>
using namespace std;
#define dim 100001
// 2^n, unde n este numarul de 0 de la final in scrierea in baza 2 a lui x
int n, operatii, v, i, pi;
int arb[dim];
ifstream fin("aib.in");
ofstream fout("aib.out");
inline int p2(int x) {
return (x ^ (x - 1)) & x;
}
int Suma(int p) { // suma pana la pozitia p
int i, s = 0;
for (i = p; i > 0; i -= p2(i))
s += arb[i];
return s;
}
void Adauga(int p, int v) {
int i;
for (i = p; i <= n; i += p2(i))
arb[i] += v;
}
int Cauta(int v) {
int i, p = pi;
for (i = 0; p; p >>= 1)
if (i + p <= n)
if (arb[i + p] <= v) {
i += p, v -= arb[i];
if (v == 0)
return i;
}
return -1;
}
int main() {
int cod, a, b;
fin >> n >> operatii;
for (i = 1; i <= n; i++) {
fin >> v;
Adauga(i, v); // Adunam v la 0.
}
for (pi = 1; pi < n; pi <<= 1)
; // pasul initial pentru cautare
while (operatii--) { // operatiile
fin >> cod; // codul operatiei
if (cod < 2) {
fin >> a >> b;
if (cod == 0)
Adauga(a, b);
else
fout << Suma(b) - Suma(a - 1) << '\n';
} //
else {
fin >> a;
fout << Cauta(a) << '\n';
}
}
}