Pagini recente » Cod sursa (job #3230507) | Cod sursa (job #2670243) | Cod sursa (job #3278644) | Cod sursa (job #2560765) | Cod sursa (job #2909171)
#include <fstream>
using namespace std;
ifstream in ("aib.in");
ofstream out ("aib.out");
#define zeros(x)((x ^ (x - 1)) & x)
const int max_size = 1e5 + 1;
int a[max_size], aib[max_size], n;
void update (int poz, int val)
{
for (int i = poz; i <= n; i += zeros(i))
{
aib[i] += val;
}
}
int querry (int poz)
{
int rez = 0;
for (int i = poz; i > 0; i -= zeros(i))
{
rez += aib[i];
}
return rez;
}
int cb (int val)
{
int rez = 0, pas = (1 << 16);
while (pas != 0)
{
if (rez + pas <= n && aib[rez + pas] < val)
{
val -= aib[rez + pas];
rez += pas;
}
pas /= 2;
}
if (rez == n || querry(rez + 1) - querry(rez) != val)
{
return -1;
}
return rez;
}
int main ()
{
int t;
in >> n >> t;
for (int i = 1; i <= n; i++)
{
in >> a[i];
update(i, a[i]);
}
while (t--)
{
int op;
in >> op;
if (op == 2)
{
int x;
in >> x;
out << cb(x) + 1 << '\n';
}
else
{
int x, y;
in >> x >> y;
if (op == 0)
{
update(x, y);
}
else
{
out << querry(y) - querry(x - 1) << '\n';
}
}
}
in.close();
out.close();
return 0;
}