Pagini recente » Cod sursa (job #1201571) | Cod sursa (job #1364759) | Cod sursa (job #2738970) | Cod sursa (job #2731695) | Cod sursa (job #2728382)
#include <bits/stdc++.h>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int aib[100005];
int n, m;
void add(int poz, int val)
{
for(int i=poz; i<=n; i += (i&(-i))) {
aib[i] += val;
}
}
int query(int poz)
{
int sum = 0;
for(int i=poz; i>0; i -= (i&(-i))) {
sum += aib[i];
}
return sum;
}
int pozmin(int sum)
{
int mask, pos;
for (mask = 1; mask <= n; mask *= 2);
mask /= 2;
pos = 0;
while (mask!=0) {
if (pos + mask <= n) {
if (aib[pos+mask] <= sum) {
pos += mask;
sum -= aib[pos];
if (sum == 0) {
return pos;
}
}
}
mask /= 2;
}
return -1;
}
int main()
{
int op, a, b;
f >> n >> m;
for (int i=1; i<=n; i++) {
f >> a;
for(int j=i; j<=n; j += (j&(-j))) {
aib[j] += a;
}
}
for (int i=1;i<=m;i++) {
f >> op;
if (op == 0) {
f>>a>>b;
add(a, b);
}
else if (op == 1) {
f >> a >> b;
g << query(b) - query(a-1) << '\n';
}
else {
f >> a;
g << pozmin(a) << '\n';
}
}
return 0;
}