Pagini recente » Cod sursa (job #3284493) | Cod sursa (job #8232) | Cod sursa (job #1036880) | Cod sursa (job #1604493) | Cod sursa (job #2171546)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
#define N_MAX 100005
int aib[N_MAX], n, m, p;
void update(int poz, int val)
{
for(int i = poz; i <= n; i+=i&(-i))
aib[i] += val;
}
long long query(int poz)
{
long long s = 0;
for(int i = poz; i ; i-=i&(-i))
s += aib[i];
return s;
}
long long sum(int a, int b)
{
return query(b) - query(a - 1);
}
int caut_bin(int val)
{
int step = 1, poz = 0;
for(;step <= n; step <<= 1);
for(; step; step >>= 1)
if(step + poz <= n)
if(aib[step + poz] <= val)
{
poz += step;
val -= aib[poz];
}
return poz;
}
int main()
{
int x;
f >> n >> m;
for(int i = 1; i <= n; i++)
{
f >> x;
update(i, x);
}
int a, b;
while(m--)
{
f >> p;
if(p == 0)
{
f >> a >> b;
update(a, b);
}
if(p == 1)
{
f >> a >> b;
g << sum(a, b) << "\n";
}
if(p == 2)
{
f >> a;
int poz = caut_bin(a - 1);
if(query(poz + 1) == a) g << poz + 1 << "\n";
else g << - 1 << "\n";
}
}
return 0;
}