Pagini recente » Cod sursa (job #2865921) | Cod sursa (job #3159555) | Cod sursa (job #209366) | Cod sursa (job #2271458) | Cod sursa (job #3196638)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
const int nmax = 100500;
int n, aib[nmax], sol, a[nmax], m;
int ub(int x)
{
return (x&(-x));
}
void add(int p, int val)
{
for(int i = p; i <= n; i += ub(i))
aib[i] += val;
}
int sum(int p)
{
int rez = 0;
for(int i = p; i >= 1; i -= ub(i))
rez += aib[i];
return rez;
}
int found(int x)
{
int poz = 0, s = 0;
for(int i = 17; i >= 0; i --)
{
if(poz + (1<<i) <= n && s + aib[poz + (1<<i)] < x)
{
poz += (1<<i);
s += aib[poz];
}
}
if(1 + poz > n || sum(poz + 1) != x)
return -1;
else
return poz + 1;
}
int main()
{
f >> n >> m;
for(int i = 1; i <= n; i ++)
{
int x;
f >> x;
add(i, x);
}
for(int i = 1; i <= m; i ++)
{
int tip;
f >> tip;
if(tip == 0)
{
int a, x;
f >> a >> x;
add(a, x);
}
else if(tip == 1)
{
int a, b;
f >> a >> b;
g << sum(b) - sum(a - 1) << '\n';
}
else
{
int x;
f >> x;
g << found(x) << '\n';
}
}
return 0;
}