Pagini recente » Cod sursa (job #71634) | Cod sursa (job #2536373) | Cod sursa (job #144453) | Cod sursa (job #53078) | Cod sursa (job #2910371)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("aib.in");
ofstream fout ("aib.out");
const unsigned nMAX = 100e3;
int n, m;
unsigned aib[nMAX + 1];
void buildAIB()
{
for (int i = 1; i <= n; ++i)
if (i + (i & -i) <= n)
aib[i + (i & -i)] += aib[i];
}
void updateAIB(int pos, unsigned val)
{
for (; pos <= n; pos += (pos & -pos))
aib[pos] += val;
}
unsigned queryAIB(int le, int ri)
{
unsigned suma = 0, sumb = 0;
for (int i = ri; i >= 1; i -= (i & -i))
sumb += aib[i];
for (int i = le-1; i >= 1; i -= (i & -i))
suma += aib[i];
return sumb - suma;
}
int idkAIB(unsigned x)
{
int st = 1, dr = n, sol = -1;
while (st <= dr)
{
int mj = (st+dr) / 2;
unsigned sum = queryAIB(1, mj);
if (sum > x)
dr = mj-1;
else if (sum == x)
{
sol = mj;
dr = mj-1;
}
else
st = mj+1;
}
return sol;
}
int main()
{
fin >> n >> m;
for (int i = 1; i <= n; ++i)
fin >> aib[i];
buildAIB();
for (int i = 1; i <= m; ++i)
{
int op;
fin >> op;
if (op == 0)
{
unsigned a, b;
fin >> a >> b;
updateAIB(a, b);
}
else if (op == 1)
{
unsigned a, b;
fin >> a >> b;
fout << queryAIB(a, b) << '\n';
}
else if (op == 2)
{
unsigned a;
fin >> a;
fout << idkAIB(a) << '\n';
}
}
}