Pagini recente » Cod sursa (job #1071240) | Cod sursa (job #2265210) | Cod sursa (job #1824784) | Cod sursa (job #2264936) | Cod sursa (job #1076280)
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
#define nmax 100001
int i, n, m;
int ret;
int AIB[nmax];
inline void update(int i, int v) {
for (int u = i; u <= n; u += (u & -u)) AIB[u] += v;
}
inline int query(int i) {
int ans = 0;
for (int u = i; u >= 1; u -= (u & -u)) ans += AIB[u];
return ans;
}
inline int search(int a) {
int i, ans, q, cnt = ret;
if (query(n) == a) return n;
for (i = n; cnt; cnt >>= 1) {
if (i - cnt >= 0) q = query(i - cnt);
else
continue;
if (q >= a) {
if (q == a) ans = i - cnt;
i -= cnt;
}
}
return ans;
}
int op, a, b;
int main() {
fin >> n >> m;
for (i = 1; i <= n; ++i) fin >> AIB[i];
for (ret = 1; ret <= n; ret <<= 1);
for (i = 1; i <= n; ++i)
AIB[i + (i & -i)] += AIB[i];
for (i = 1; i <= m; ++i) {
fin >> op >> a;
if (op == 0) {
fin >> b;
update(a, b);
}
if (op == 1) {
fin >> b;
fout << query(b) - query(a - 1) << '\n';
}
if (op == 2)
fout << search(a) << '\n';
}
return 0;
}