Pagini recente » Cod sursa (job #2499794) | Atasamentele paginii irim_eralumis | Cod sursa (job #2499806) | Cod sursa (job #2573031) | Cod sursa (job #2477649)
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, m;
long a[100010];
int highestPowerOf2(int n) {
int pow = 1;
while (pow <= n) {
pow *= 2;
}
return pow / 2;
}
void update(int p, int v) {
for (int i = p; i <= n; i += i & -i) {
a[i] += v;
}
}
long query(int p) {
long s = 0;
for (int i = p; i > 0; i -= i & -i) {
s += a[i];
}
return s;
}
int searchK(long x, int dr) {
int lun = dr & -dr;
cerr << x << " " << dr << " " << a[dr] << " " << "\n";
if (a[dr] == x) {
return dr;
}
if (lun == 1) {
return -1;
}
if (a[dr] > x || a[dr] == 0)
return searchK(x, dr - lun / 2);
return searchK(x - a[dr], dr + lun / 2);
}
void citire() {
fin >> n >> m;
int val;
for (int i = 1; i <= n; ++i) {
fin >> val;
update(i, val);
}
}
int main()
{
citire();
int c;
long x, y;
for (int i = 1; i <= m; ++i) {
fin >> c >> x;
if (c == 0) {
fin >> y;
update(x, y);
}
else if (c == 1) {
fin >> y;
fout << query(y) - query(x - 1) << "\n";
}
else {
fout << searchK(x, highestPowerOf2(n)) << "\n";
cerr << "\n\n";
}
}
return 0;
}