Pagini recente » Cod sursa (job #3181507) | Cod sursa (job #722166) | Cod sursa (job #562158) | Cod sursa (job #1290381) | Cod sursa (job #1498025)
#include<fstream>
#include<iostream>
#include<string.h>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
#define MAX 100001
int AIB[MAX],N,M;
void update(int x, int y)
{
for (;x <= N;x += x&(-x))
AIB[x] += y;
}
int query(int x)
{
int s = 0;
for (;x;x -= x&(-x))
s += AIB[x];
return s;
}
int main()
{
in >> N >> M;
int x, y, op;
for (int i = 1;i <= N;++i)
{
in >> x;
update(i, x);
}
for (int i = 1;i <= M;++i)
{
in >> op;
switch (op)
{
case 0:
in >> x >> y;
update(x, y);
break;
case 1:
in >> x >> y;
out << query(y) - query(x - 1) << '\n';
break;
case 2:
{
int l = 1, r = N;
in >> x;
int min = (1 << 30);
while (l <= r)
{
int mid = (l + r) / 2;
int v = query(mid);
if (v == x)
{
min = mid;
r = mid - 1;
}
else if (v < x)
l = mid + 1;
else
r = mid - 1;
}
if (min == (1 << 30))
out << -1 << '\n';
else
out << min << '\n';
break;
}
}
}
return 0;
}