Pagini recente » Cod sursa (job #611124) | Cod sursa (job #884223) | Cod sursa (job #2669004) | Cod sursa (job #393356) | Cod sursa (job #2610891)
#include <fstream>
#define ub(x) (x&(-x))
using namespace std;
ifstream f ("aib.in");
ofstream g ("aib.out");
constexpr int NMAX = 1e5 + 5;
int aib[NMAX];
int N;
void Update (int poz, int val)
{
for (int i = poz; i <= N; i += ub(i))
aib[i] += val;
}
int Query (int poz)
{
int S = 0;
for (int i = poz; i > 0; i -= ub(i))
S += aib[i];
return S;
}
void Tip_0 ()
{
int x, y;
f >> x >> y;
Update(x, y);
}
void Tip_1 ()
{
int x, y;
f >> x >> y;
g << Query(y) - Query(x-1) << '\n';
}
void Tip_2 ()
{
int x;
f >> x;
int st = 1, dr = N;
int sol = -1;
while (st <= dr)
{
int mij = (st + dr) / 2;
int Sum = Query(mij);
if (Sum < x) st = mij + 1;
else if (Sum > x) dr = mij - 1;
else
{
sol = mij;
dr = mij - 1;
}
}
g << sol << '\n';
}
void Read_and_Solve ()
{
int T;
f >> N >> T;
for (int i = 1; i <= N; ++i)
{
int x;
f >> x;
Update(i, x);
}
for (; T; --T)
{
int task;
f >> task;
if (task == 0) Tip_0();
if (task == 1) Tip_1();
if (task == 2) Tip_2();
}
}
int main()
{
Read_and_Solve();
return 0;
}