Mai intai trebuie sa te autentifici.
Cod sursa(job #1749984)
Utilizator | Data | 29 august 2016 13:40:52 | |
---|---|---|---|
Problema | Arbori indexati binar | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.61 kb |
#include <bits/stdc++.h>
int tree[100001];
int n;
void
update(int index,
int val)
{
for (;index <= n; index += (index & -index))
{
tree[index] += val;
}
}
int
getSum(int beg,
int end)
{
int sum;
sum = 0;
for (; end; end -= (end & -end))
{
sum += tree[end];
}
--beg;
for (; beg; beg -= (beg & -beg))
{
sum -= tree[beg];
}
return sum;
}
int
getPos(int sum)
{
int index;
int bitMask;
int i;
for (bitMask = 1; bitMask <= n; bitMask <<= 1);
bitMask >>= 1;
index = 0;
while ( (bitMask) and
(sum) )
{
i = index + bitMask;
if ( (i <= n) and
(sum >= tree[i]) )
{
sum -= tree[i];
index = i;
}
bitMask >>= 1;
}
if ( (not index) or
(sum) )
{
return -1;
}
return index;
}
int main()
{
std::ifstream mama("aib.in");
std::ofstream tata("aib.out");
int index;
int x;
int y;
int m;
int t;
mama >> n;
mama >> m;
for (index = 1; index <= n; ++index)
{
mama >> x;
update(index,
x);
}
for (index = 0; index < m; ++index)
{
mama >> t;
mama >> x;
if (2 > t)
{
mama >> y;
}
if (0 == t)
{
update(x,
y);
}
else if (1 == t)
{
tata << getSum(x,
y) << '\n';
}
else
{
tata << getPos(x) << '\n';
}
}
return 0;
}