Pagini recente » Cod sursa (job #1768936) | Cod sursa (job #1045800) | Cod sursa (job #806432) | Cod sursa (job #393199) | Cod sursa (job #1282150)
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int N, M;
int AIB[100001];
void update(int pos, int val)
{
for (; pos <= N; pos += pos & -pos)
AIB[pos] += val;
}
int query(int pos)
{
int sum = 0;
for (; pos >= 1; pos -= pos & -pos)
sum += AIB[pos];
return sum;
}
int search(int val)
{
int lt = 0, rt = N + 1, sum;
sum = query(N);
if (val > sum)
return -1;
while (rt - lt > 1)
{
int mid = (lt + rt) >> 1;
sum = query(mid);
if (sum < val)
lt = mid;
else
rt = mid;
}
if (query(rt) != val)
return -1;
return rt;
}
int main()
{
fin >> N >> M;
for (int i = 1, x; i <= N; ++i)
{
fin >> x;
update(i, x);
}
int type, pos, val, pos1, pos2;
while (M--)
{
fin >> type;
if (type == 0)
{
fin >> pos >> val;
update(pos, val);
}
else if (type == 1)
{
fin >> pos1 >> pos2;
fout << query(pos2) - query(pos1 - 1) << '\n';
}
else
{
fin >> pos;
fout << search(pos) << '\n';
}
}
fin.close();
fout.close();
return 0;
}