Pagini recente » Cod sursa (job #880527) | Cod sursa (job #2869922) | Cod sursa (job #125642) | Cod sursa (job #2731058) | Cod sursa (job #1554122)
#include <fstream>
#define NMax 100010
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int numElem, queries, BIT[NMax];
int getSum(int idx)
{
int sum = 0;
while (idx > 0) {
sum += BIT[idx];
idx = idx - (idx & (-idx));
}
return sum;
}
void update(int idx, int val)
{
while (idx <= numElem) {
BIT[idx] += val;
idx = idx + (idx & (-idx));
}
}
int findSum(int sum)
{
int st = 1, dr = numElem, sol = -1;
while (st <= dr) {
int mid = (st + dr) / 2;
if (getSum(mid) >= sum) {
dr = mid - 1;
if (getSum(mid) == sum)
sol = mid;
}
else
st = mid + 1;
}
return sol;
}
int main()
{
f >> numElem >> queries;
int elem;
for (int i = 1; i <= numElem; i++) {
f >> elem;
update(i, elem);
}
int cmd, val1, val2;
for (int i = 1; i <= queries; i++) {
f >> cmd;
if (cmd == 0) {
f >> val1 >> val2;
update(val1, val2);
}
else if (cmd == 1) {
f >> val1 >> val2;
g << getSum(val2) - getSum(val1 - 1) << "\n";
}
else {
f >> val1;
g << findSum(val1) << "\n";
}
}
}