Pagini recente » Borderou de evaluare (job #2703822) | Monitorul de evaluare | Istoria paginii problema/bvarcolaci | Profil AlexandruV | Cod sursa (job #2906318)
#include <bits/stdc++.h>
#define NMAX ((int)1e5)
#define COMM_UPDATE 0
#define COMM_SUM_QUERY 1
#define COMM_MIN_INDEX 2
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int tree[NMAX + 1];
int v[NMAX + 1];
void update(int index, const int new_val, const int n_max) {
while (index <= n_max) {
tree[index] += new_val;
index += (index & -index);
}
}
int get_val(int index) {
int val = 0;
while (index > 0) {
val += tree[index];
index -= (index & -index);
}
return val;
}
int binary_search(int n, int value)
{
int step = 1;
for (; step < n; step <<= 1);
for(int i = 0; step; step >>= 1) {
if(i + step <= n) {
if(value >= tree[i + step]) {
i += step;
value -= tree[i];
if (value == 0) {
return i;
}
}
}
}
return -1;
}
int main(void) {
int n, m;
fin >> n >> m;
for (int i = 1; i <= n; ++i) {
fin >> v[i];
update(i, v[i], n);
}
for (int i = 0; i < m; ++i) {
int type;
fin >> type;
switch (type) {
case COMM_UPDATE:
int pos, val;
fin >> pos >> val;
v[pos] += val;
update(pos, val, n);
break;
case COMM_SUM_QUERY:
int left, right;
fin >> left >> right;
fout << get_val(right) - get_val(left - 1) << "\n";
break;
case COMM_MIN_INDEX:
int sum;
fin >> sum;
fout << binary_search(n, sum) << "\n";
}
}
return 0;
}