Pagini recente » Cod sursa (job #2638833) | Cod sursa (job #1584235) | Cod sursa (job #1322931) | Cod sursa (job #490390) | Cod sursa (job #2847648)
#include <bits/stdc++.h>
using namespace std;
/**
8 6
a = 25 42 8 15 0 0 0 13 55 16 67
0 5 12
2 25
2 90
1 7 7
1 2 8
2 241
*/
ifstream fin("aib.in");
ofstream fout("aib.out");
int aib[100003], n;
/// ret. suma pe intervalul [1..k]
int Suma(int k)
{
int s = 0;
while (k > 0)
{
s += aib[k];
k = k - (k&-k);
}
return s;
}
void Update(int k, int val)
{
while (k <= n)
{
aib[k] += val;
k = k + (k & -k);
}
}
/// caut binar cea mai din stanga pozitie
/// p in care Suma(p) >= val
int CautBin(int val)
{
if (val < aib[1]) return -1;
int st, dr, mid, p;
st = 1; dr = p = n;
while (st <= dr)
{
mid = (st + dr) / 2;
if (Suma(mid) >= val)
{
p = mid;
dr = mid - 1;
}
else st = mid + 1;
}
if (Suma(p) == val) return p;
return -1;
}
int main()
{
int i, k, Q, op, x, y;
fin >> n >> Q;
for (i = 1; i <= n; i++)
{
fin >> k;
Update(i, k);
}
for (i = 1; i <= Q; i++)
{
fin >> op;
if (op == 0)
{
fin >> k >> x;
Update(k, x);
}
else if (op == 1)
{
fin >> x >> y;
fout << Suma(y) - Suma(x - 1) << "\n";
}
else /// op == 2
{
fin >> x;
fout << CautBin(x) << "\n";
}
}
return 0;
}