Pagini recente » Cod sursa (job #2060422) | Cod sursa (job #128954) | Cod sursa (job #2937360) | Cod sursa (job #1096422) | Cod sursa (job #2917476)
#include <bits/stdc++.h>
#define NMAX 100003
using namespace std;
int aib[NMAX], n, m;
class InParser {
private:
static const int buffSZ = (1 << 15);
ifstream File;
int buffPos;
char buff[buffSZ];
void _advance() {
if (++buffPos == buffSZ) {
File.read(buff, buffSZ);
buffPos = 0;
}
}
public:
InParser(const char *FileName) {
buffPos = buffSZ - 1;
File.open(FileName);
}
InParser& operator >>(int &no) {
while (!isdigit(buff[buffPos]))
_advance();
no = 0;
while (isdigit(buff[buffPos])) {
no = no * 10 + buff[buffPos] - '0';
_advance();
}
return *this;
}
};
InParser fin("aib.in");
ofstream fout("aib.out");
inline int step(int mask) {
return ((mask ^ (mask - 1)) & mask);
}
void add_aib(int position, int value) {
for (register int i = position; i <= n; i += step(i))
aib[i] += value;
}
int querry_aib(int position) {
int sum = 0;
for (register int i = position; i > 0; i -= step(i))
sum += aib[i];
return sum;
}
int search_aib(int value) {
register int step;
for (step = 1; step < n; step <<= 1) {}
register int i;
for (i = 0; step; step >>= 1)
if (i + step <= n && aib[i + step] <= value) {
value -= aib[i + step];
i += step;
if (!value)
return i;
}
return -1;
}
void solve() {
fin >> n >> m;
for (register int i = 1, x; i <= n; ++i) {
fin >> x;
add_aib(i, x);
}
for (int op = 1, type; op <= m; ++op) {
fin >> type;
if (type == 0) {
int a, b;
fin >> a >> b;
add_aib(a, b);
} else if (type == 1) {
int a, b;
fin >> a >> b;
fout << querry_aib(b) - querry_aib(a - 1) << '\n';
} else {
int val;
fin >> val;
fout << search_aib(val) << '\n';
}
}
memset(aib, 0, (n + 3) * sizeof(int));
}
int main() {
int t = 1;
// fin >> t;
for(register int test = 1; test <= t; ++test)
solve();
return 0;
}