Pagini recente » Cod sursa (job #516801) | Cod sursa (job #1091994) | Cod sursa (job #539687) | Cod sursa (job #897096) | Cod sursa (job #2450193)
#include <iostream>
#include <algorithm>
#include <vector>
#include <fstream>
#include <cmath>
#include <iomanip>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int aib[100100];
void add(int k, int n, int x)
{
while (k <= n)
{
aib[k] += x;
k += k & -k;
}
}
int sum(int k)
{
int total = 0;
while (k > 0)
{
total += aib[k];
k -= k & -k;
}
return total;
}
int Find(int val, int n)
{
int bit, poz = 0, i;
for (bit = 0; bit < n; bit <<= 1);
for (i = 0; bit; bit >>= 1)
{
if (i + bit <= n && aib[i + bit] <= val)
{
val -= aib[i + bit];
i += bit;
}
}
if (val)
return -1;
return i;
}
int main()
{
ios_base::sync_with_stdio(false);
int n, m, Max = 0;
fin >> n >> m;
for (int i = 1; i <= n; i++)
{
int x;
fin >> x;
Max = max(Max, x);
add(i, n, x);
}
for (int i = 1; i <= m; i++)
{
int t, x, y;
fin >> t;
if (t == 0)
{
fin >> x >> y;
add(x, n, y);
}
if (t == 1)
{
fin >> x >> y;
cout << sum(y) - sum(x-1) << '\n';
}
if (t == 2)
{
fin >> x;
if (!x) {
fout << -1 << '\n';
continue;
}
fout << Find(x, n) << '\n';
}
}
}