Pagini recente » Cod sursa (job #1035042) | Cod sursa (job #2126763) | Cod sursa (job #1162020) | Cod sursa (job #645623) | Cod sursa (job #1917955)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
#define N_MAX 100005
int aib[N_MAX];
int n, m;
void update(int poz, int val)
{
for( ; poz<=n; poz+=poz & (-poz))
aib[poz] += val;
}
int sum(int poz)
{
int s = 0;
for( ; poz > 0; poz -= poz & (-poz))
s += aib[poz];
return s;
}
int query(int st, int dr)
{
return (sum(dr) - sum(st - 1));
}
int bin_search(int val)
{
int step, pos = 0;
for(step = 1; step <= n; step <<= 1);
for(; step > 0; step >>= 1)
if(pos + step <= n)
if(aib[pos + step] <= val)
{
val -= aib[pos + step];
pos += step;
}
return pos;
}
int main()
{
f >> n >> m;
int x;
for(int i = 1; i <= n; i++)
{
f >> x;
update(i, x);
}
int p, pos, val, st, dr;
for(int i = 1; i <= m; i++)
{
f >> p;
if(p == 0)
{
f >> pos >> val;
update(pos, val);
}
if(p == 1)
{
f >> st >> dr;
g << query(st, dr) << '\n';
}
if(p == 2)
{
f >> val;
pos = bin_search(val - 1);
if(sum(pos + 1) == val) g << pos + 1;
else g << -1;
g << '\n';
}
}
return 0;
}