Pagini recente » Cod sursa (job #2016894) | Cod sursa (job #2298226) | Cod sursa (job #95859) | Cod sursa (job #1650818) | Cod sursa (job #2465747)
#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
#define p2(x) ((x ^ (x - 1)) & x)
int N, O, T, i, pi;
int Arb[dim];
ifstream fin("aib.in");
ofstream fout("aib.out");
void Adauga(int p, int v) {
int i;
for (i = p; i <= N; i += p2(i))
Arb[i] += v;
}
int Suma(int p) { // suma pana la pozitia p
int i, s = 0;
for(i=p;i>=1;i-=p2(i))
s+=Arb[i];
return s;
}
int Search(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 >> O;
for (i = 1; i <= N; i++) {
fin >> T;
Adauga(i, T); // Adunam T la 0.
}
for (pi = 1; pi < N; pi <<= 1); // pasul initial pentru cautare
while (O--) { // 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 << Search(a) << '\n';
}
}
}