Pagini recente » Cod sursa (job #3271991) | Cod sursa (job #2943801) | Cod sursa (job #1391904) | Cod sursa (job #1813335) | Cod sursa (job #3231408)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
struct AIB {
std::vector<int> bit;
int n;
AIB() = default;
explicit AIB(int n) {
this->n = n;
bit.assign(n+1, 0);
}
explicit AIB(std::vector<int> &a) : AIB(a.size()) {
for(int i = 1; i <= a.size(); i++) {
update(i, a[i]);
}
}
int sum(int r) {
int res = 0;
while(r > 0) {
res += bit[r];
r -= (r & -r);
}
return res;
}
int sum(int l, int r) {
return sum(r) - sum(l-1);
}
void update(int idx, int val) {
while(idx <= this->n) {
bit[idx] += val;
idx += (idx & -idx);
}
}
int pozmin(int s) {
int k = -1;
int left = 1, right = this->n;
while(left <= right) {
int mid = left + (right - left) / 2;
int suma = sum(mid);
if(suma >= s) {
right = mid - 1;
if(suma == s) k = mid;
}
else {
left = mid + 1;
}
}
return k;
}
};
#define TE41ST
const std::string file = "aib";
int main() {
#ifdef TEST
std::ifstream fin("../test.in");
std::ofstream fout("../output.out");
#endif
#ifndef TEST
std::ifstream fin(file + ".in");
std::ofstream fout(file + ".out");
#endif
int n, m;
fin >> n >> m;
std::vector<int> v(n+1);
for(int i = 1; i <= n; i++) {
fin >> v[i];
}
AIB aib{v};
for(int i = 0; i < m; i++) {
int op;
fin >> op;
if(op == 0) {
int a, b;
fin >> a >> b;
aib.update(a, b);
}
else if(op == 1) {
int a, b;
fin >> a >> b;
fout << aib.sum(a, b) << '\n';
}
else {
int a;
fin >> a;
int k = aib.pozmin(a);
fout << k << '\n';
}
}
fin.close();
fout.close();
return 0;
}