Pagini recente » Cod sursa (job #2344383) | Cod sursa (job #1150047) | Cod sursa (job #2854338) | Cod sursa (job #1295468) | Cod sursa (job #2070359)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int NMAX = 100005;
int n, AIB[NMAX];
int zeros(int x)
{
return x ^ (x & (x - 1));
}
void Update(int poz, int val)
{
for (int i = poz; i <= n; i += zeros(i))
AIB[i] += val;
}
int Query1(int poz)
{
int rez = 0;
for (int i = poz; i >= 1; i -= zeros(i)) rez += AIB[i];
return rez;
}
int Query2(int x)
{
int last = 0;
int ramas = x;
for (int 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()
{
int m;
in >> n >> m;
for(int i = 1; i <= n; i++)
{
int x;
in >> x;
Update(i, x);
}
for(int i = 1; i <= m; i++)
{
int p;
in >> p;
if(p == 0)
{
int poz, val;
in >> poz >> val;
Update(poz, val);
}
else if(p == 1)
{
int x, y;
in >> x >> y;
out << Query1(y) - Query1(x - 1) << "\n";
}
else
{
int x;
in >> x;
out << Query2(x) << "\n";
}
}
return 0;
}