Pagini recente » Cod sursa (job #1118730) | Cod sursa (job #32159) | Cod sursa (job #1580985) | Cod sursa (job #1056339) | Cod sursa (job #1420552)
// aib - suma pe interval - < N , logN >
#include <fstream>
#define Nmax 100009
#define LSB(x) (x&(-x))
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int N, M, aib[Nmax],val;
void upd(const int& poz, const int& x) {
for(int i = poz; i <= N; i += LSB(i)) aib[i] += x;
}
int S(const int& poz) {
int sum = 0;
for(int i = poz; i > 0; i -= LSB(i)) sum += aib[i];
return sum;
}
int searchAIB(int val) {
int step = (1<<30);
for(int i = 0; step; step >>= 1)
if(i + step <= N && aib[i+step] <= val) {
i += step;
val -= aib[i];
if(!val) return i;
}
return -1;
}
int main() {
f >> N >> M;
/* Initializare */
for(int i = 1; i <= N; ++i)
f >> val , upd(i, val);
for(int i = 1; i <= M; ++i) {
int op, a, b, val, poz;
f >> op;
if(!op) {
f >> poz >> val;
upd(poz, val);
continue;
}
if(op==1) {
f >> a >> b;
g << S(b) - S(a-1) << '\n';
continue;
}
if(op == 2) {
f >> val;
g << searchAIB(val) << '\n';
}
}
f.close();g.close();
return 0;
}