Pagini recente » Cod sursa (job #688950) | Cod sursa (job #246398) | Cod sursa (job #580823) | Cod sursa (job #687698) | Cod sursa (job #1923303)
#include <iostream>
#include <fstream>
#define NMAX 100005
using namespace std;
ifstream fin ("aib.in");
ofstream fout ("aib.out");
int n, m, tree[NMAX], powmax;
void add (int index, int val) {
tree[index] += val;
index += (index & (-index));
if (index <= n) {
add(index,val);
}
}
int stok (int index) {
if (index == 0) {
return 0;
}
return (tree[index] + stok(index ^ (index & (-index))));
}
int find (int a) {
int index = 0;
for (int k = powmax; k >= 0; --k) {
if (tree[index + (1 << k)] <= a) {
a -= tree[index + (1 << k)];
index += (1 << k);
if (!a) {
return index;
}
}
}
return -1;
}
int main ()
{
fin >> n >> m;
powmax = 0;
while ((1 << powmax) <= n) {
++powmax;
}
--powmax;
//cout << (1 << powmax);
int p, x, y;
for (int i = 1; i <= n; ++i) {
fin >> x;
add(i,x);
}
for (int i = 1; i <= m; ++i) {
fin >> p;
if (p == 0) {
fin >> x >> y;
add(x,y);
}
else
if (p == 1) {
fin >> x >> y;
fout << stok(y) - stok(x-1) << '\n';
}
else {
fin >> x;
fout << find(x) << '\n';
}
}
/*for (int i = 1; i <= n; ++i) {
cout << tree[i] << " ";
}*/
fin.close();
fout.close();
return 0;
}