Pagini recente » Cod sursa (job #2743102) | Monitorul de evaluare | Cod sursa (job #192779) | Cod sursa (job #601932) | Cod sursa (job #1157041)
#include <fstream>
#define NMAX 100005
#define zeros(x) x & (-x)
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n;
int aib[NMAX];
void add(int poz, int x)
{
for (; poz <= n; poz += zeros(poz))
aib[poz] += x;
}
int query(int poz)
{
int rez = 0;
for (; poz > 0; poz -= zeros(poz))
rez += aib[poz];
return rez;
}
int caut(int val)
{
int step = 1;
while (step < n) step <<= 1;
int k;
for (k = 0; step; step >>= 1)
if (k+step <= n && aib[k+step] <= val)
{
k += step;
val -= aib[k];
}
if (val != 0) return -1;
return k;
}
int main()
{
int cod, a, b, x;
int m;
fin >> n >> m;
for (int i = 1; i <= n; ++i)
{
fin >> x;
add(i,x);
}
while (m--)
{
fin >> cod;
if (cod == 0)
{
fin >> a >> b;
add(a,b);
}
else if (cod == 1)
{
fin >> a >> b;
fout << query(b) - query(a-1) << '\n';
}
else
{
fin >> a;
fout << caut(a) << '\n';
}
}
fin.close();
fout.close();
return 0;
}