Pagini recente » Cod sursa (job #83272) | Cod sursa (job #2573978) | Cod sursa (job #2879037) | Cod sursa (job #2734920) | Cod sursa (job #2870081)
#include <iostream>
#include <fstream>
using namespace std;
const string filename = "aib";
ifstream fin(filename + ".in");
ofstream fout(filename + ".out");
int n, q, pow2, aib[100005];
void update(int poz, int val)
{
for(int i = poz; i <= n; i += (i & (-i)))
aib[i] += val;
}
int query(int poz)
{
int aux = 0;
for(int i = poz; i >= 1; i -= (i & (-i)))
aux += aib[i];
return aux;
}
int cautbin(int k)
{
int aux = 0, sum = 0;
for(int i = pow2; i > 0; i >>= 1)
{
if(aux + i <= n && sum + aib[aux + i] <= k)
{
aux += i;
sum += aib[aux];
}
}
if(sum == k && aux != 0)
return aux;
else
return -1;
}
int main()
{
fin >> n >> q;
for(int i = 1; i <= n; i++)
{
int a;
fin >> a;
update(i, a);
}
pow2 = 1;
while(pow2 * 2 <= n)
pow2 *= 2;
for(int i = 1; i <= q; i++)
{
int cer, a, b;
fin >> cer;
if(cer == 0)
{
fin >> a >> b;
update(a, b);
}
if(cer == 1)
{
fin >> a >> b;
fout << query(b) - query(a - 1) << '\n';
}
if(cer == 2)
{
fin >> a;
fout << cautbin(a) << '\n';
}
}
return 0;
}