Pagini recente » Cod sursa (job #1446587) | Cod sursa (job #1601261) | Cod sursa (job #2099429) | Rating Zaharia David (DavidZaharia) | Cod sursa (job #2040258)
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int aib[N], s[N];
int n, m;
static int nextch() {
const int BMAX = 4096;
static char buff[BMAX];
static int bp = BMAX;
if (bp == BMAX) {
fread(buff, 1, BMAX, stdin);
bp = 0; }
return buff[bp++]; }
static void get(int &arg) {
char ch;
while ((ch = nextch()) < '0');
arg = 0;
do {
arg = arg * 10 + ch - '0';
ch = nextch(); }
while (ch >= '0'); }
constexpr int lsb(int x) {
return x & -x; }
static void update(int pos, int val) {
for (; pos < N; pos+= lsb(pos))
aib[pos]+= val; }
static int query(int pos) {
int ant;
for (ant = 0; pos > 0; pos-= lsb(pos))
ant+= aib[pos];
return ant; }
static int bsrch(int &val) {
int ant = 0;
for (int msk = 1 << 16; msk > 0; msk/= 2)
if (ant + msk <= n && val >= aib[ant + msk]) {
val-= aib[ant + msk];
ant+= msk; }
return val ? -1 : ant; }
int main() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
get(n), get(m);
for (int t, i = 1; i <= n; ++i) {
get(t);
s[i] = s[i - 1] + t;
aib[i] = s[i] - s[i - lsb(i)]; } // sa moara toti de ciuda!
for (int pos, val, op, a, b, i = 1; i <= m; ++i) {
get(op);
switch (op) {
case 0: {
get(pos), get(val);
update(pos, val);
break; }
case 1: {
get(a), get(b);
printf("%d\n", query(b) - query(a - 1));
break; }
case 2: {
get(pos);
printf("%d\n", bsrch(pos));
break; } } }
return 0; }