Pagini recente » Cod sursa (job #937898) | Cod sursa (job #795897) | Cod sursa (job #957372) | Cod sursa (job #99548) | Cod sursa (job #2817048)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e5;
int aib[NMAX + 5],v[NMAX + 5];
int bit,n,ans,pas;
void update(int poz, int val) {
bit = 0;
while (poz <= n) {
aib[poz] += val;
while (!(poz & (1 << bit)))
bit++;
poz += (1 << bit);
bit++;
}
}
int query(int poz) {
ans = 0;
while (poz) {
ans += aib[poz];
while (!(poz & (1 << bit)))
bit++;
poz -= (1 << bit);
bit++;
}
return ans;
}
int cb(int val) {
ans = 0;
for (pas = 1;pas < n;pas <<= 1);
for (;pas;pas >>= 1) {
if (ans + pas <= n && val >= aib[ans + pas]) {
ans += pas;
val -= aib[ans];
if (!val)
return ans;
}
}
return -1;
}
int main()
{
ifstream fin("aib.in");
ofstream fout("aib.out");
int m,cer,a,b;
fin >> n >> m;
for (int i = 1;i <= n;i++){
fin >> v[i];
update(i, v[i]);
}
for (int i = 0;i < m;i++) {
fin >> cer;
if (cer == 0) {
fin >> a >> b;
update(a, b);
}
else if (cer == 1) {
fin >> a >> b;
fout << query(b) - query(a - 1) << '\n';
}
else {
fin >> a;
fout << cb(a) << '\n';
}
}
return 0;
}