Pagini recente » Cod sursa (job #982319) | Cod sursa (job #85996) | Cod sursa (job #514410) | Cod sursa (job #3234782) | Cod sursa (job #2070361)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const long long NMAX = 100005;
long long n;
long long AIB[NMAX];
long long zeros(long long x)
{
return x ^ (x & (x - 1));
}
void Update(long long poz, long long val)
{
for (long long i = poz; i <= n; i += zeros(i))
AIB[i] += val;
}
long long Query1(long long poz)
{
long long rez = 0;
for (long long i = poz; i >= 1; i -= zeros(i)) rez += AIB[i];
return rez;
}
long long Query2(long long x)
{
long long last = 0;
long long ramas = x;
for (long long i = 20; i >= 0; i--) //parcurg puterile
if (last + (1 << i) <= n && AIB[last + (1 << i)] <= ramas) //continui
{
last += (1 << i);
ramas -= AIB[last];
}
if(ramas == 0)
return last;
return -1;
}
int main()
{
long long m;
in >> n >> m;
for(long long i = 1; i <= n; i++)
{
long long x;
in >> x;
Update(i, x);
}
for(long long i = 1; i <= m; i++)
{
long long p;
in >> p;
if(p == 0)
{
long long poz, val;
in >> poz >> val;
Update(poz, val);
}
else if(p == 1)
{
long long x, y;
in >> x >> y;
out << Query1(y) - Query1(x - 1) << "\n";
}
else
{
long long x;
in >> x;
out << Query2(x) << "\n";
}
}
return 0;
}