Pagini recente » Cod sursa (job #955450) | Cod sursa (job #2603982) | Cod sursa (job #2349691) | Cod sursa (job #148243) | Cod sursa (job #2139455)
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int last2(int);
int query(int);
void update(int, int);
int n, m;
int aib[100005];
int main()
{
int tip, a, b;
int st, dr, mij, q;
fin >> n >> m;
for (int i = 1; i <= n; i++)
{
fin >> a;
update(i, a);
}
for (int i = 1; i <= m; i++)
{
fin >> tip;
if (tip == 2)
{
fin >> a;
st = 0; dr = n + 1;
while (dr - st > 1)
{
mij = st + (dr - st) / 2;
q = query(mij);
if (q < a) st = mij;
else dr = mij;
}
if (query(dr) == a)
fout << dr << '\n';
else fout << "-1\n";
}
else
{
fin >> a >> b;
if (tip == 0) update(a, b);
else fout << query(b) - query(a - 1) << '\n';
}
}
return 0;
}
int query(int pos)
{
int sum = 0;
for (int i = pos; i; i -= last2(i))
sum += aib[i];
return sum;
}
void update(int pos, int val)
{
for (int i = pos; i <= n; i += last2(i))
aib[i] += val;
}
int last2(int x)
{
return x & (x ^ (x - 1));
}