Pagini recente » Cod sursa (job #2813701) | Cod sursa (job #1745633) | Cod sursa (job #690595) | Cod sursa (job #813206) | Cod sursa (job #2753159)
#include <fstream>
using namespace std;
const int N = 1e5 + 1;
const int L = 16;
int aib[N], n;
void actualizare(int poz, int val)
{
while (poz <= n)
{
aib[poz] += val;
poz += (poz & (-poz));
}
}
int interogare(int poz)
{
int sum = 0;
while (poz != 0)
{
sum += aib[poz];
poz -= (poz & (-poz));
}
return sum;
}
int caut(int val)
{
if (val == 0)
{
return -1;
}
int r = 0, pas = 1 << L;
while (pas != 0)
{
/*
if (r + pas <= n && interogare(r + pas) <= val)
{
r += pas;
}
*/
if (r + pas <= n && aib[r + pas] <= val)
{
val -= aib[r + pas];
r += pas;
}
pas >>= 1;
}
//if (interogare(r) < val)
if (val != 0)
{
return -1;
}
return r;
}
int main()
{
ifstream in("aib.in");
ofstream out("aib.out");
int m;
in >> n >> m;
for (int i = 1; i <= n; i++)
{
int nr;
in >> nr;
actualizare(i, nr);
}
for (int i = 0; i < m; i++)
{
int tip;
in >> tip;
if (tip == 0)
{
int poz, val;
in >> poz >> val;
actualizare(poz, val);
}
else if (tip == 1)
{
int a, b;
in >> a >> b;
out << interogare(b) - interogare(a - 1) << "\n";
}
else
{
int val;
in >> val;
out << caut(val) << "\n";
}
}
in.close();
out.close();
return 0;
}