Pagini recente » Cod sursa (job #2734960) | Cod sursa (job #2534402) | Cod sursa (job #54016) | Cod sursa (job #1349115) | Cod sursa (job #2572515)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
class FenTree {
private:
int n;
vector<int> bit;
public:
FenTree(int n) :
n(n), bit(n + 1) { }
void update(int pos, int val) {
for (int i = pos; i <= n; i += i & -i)
bit[i] += val;
}
int query(int pos) {
int sum = 0;
for (int i = pos; i >= 1; i -= i & -i)
sum += bit[i];
return sum;
}
int query(int left, int right) {
return query(right) - query(left - 1);
}
int find(int val) {
int lo = 0, hi = n + 1;
while (hi - lo > 1) {
int md = (lo + hi) / 2;
if (query(md) < val)
lo = md;
else
hi = md;
}
return (1 <= hi && hi <= n && query(hi) == val ? hi : -1);
}
};
int main() {
int n, q; fin >> n >> q;
FenTree bit(n);
for (int i = 1; i <= n; i++) {
int x; fin >> x;
bit.update(i, x);
}
for (int i = 0; i < q; i++) {
int t; fin >> t;
if (!t) {
int x, y; fin >> x >> y;
bit.update(x, y);
}
else if (t == 1) {
int x, y; fin >> x >> y;
fout << bit.query(x, y) << '\n';
}
else {
int x; fin >> x;
fout << bit.find(x) << '\n';
}
}
fout.close();
return 0;
}