Pagini recente » Cod sursa (job #672408) | Cod sursa (job #3031990) | Cod sursa (job #891254) | Cod sursa (job #1821923) | Cod sursa (job #2478369)
#include <cstdio>
#include <fstream>
#include <vector>
using namespace std;
char const *inFile = "aib.in";
char const *outFile = "aib.out";
ofstream Write(outFile);
void Update(
vector<unsigned> &AIB,
unsigned const index,
unsigned const value
) {
for (unsigned i = index; i < AIB.size(); i += (i ^ (i - 1)) & i) {
AIB[i] += value;
}
}
unsigned Compute(
vector<unsigned> &AIB,
unsigned const index
) {
unsigned sum = 0;
for (unsigned i = index; i > 0; i -= (i ^ (i - 1)) & i) {
sum += AIB[i];
}
return sum;
}
void Build(
vector<unsigned> &AIB
) {
unsigned value;
for (unsigned i = 1; i < AIB.size(); ++i) {
scanf("%d", &value);
Update(AIB, i, value);
}
}
unsigned Query1(
vector<unsigned> &AIB,
unsigned const left,
unsigned const right
) {
return Compute(AIB, right) - Compute(AIB, left - 1);
}
int Query2(
vector<unsigned> &AIB,
unsigned const value
) {
unsigned left = 1;
unsigned right = AIB.size();
unsigned mid;
unsigned computedValue;
while (left <= right) {
mid = right - ((right - left) >> 1);
computedValue = Compute(AIB, mid);
if (computedValue == value) {
return mid;
}
else if (computedValue < value) {
left = mid + 1;
}
else {
right = mid - 1;
}
}
return -1;
}
void ReadQueries(
vector<unsigned> &AIB,
unsigned const m
) {
unsigned type;
unsigned a;
unsigned b;
for (unsigned i = 0; i < m; ++i) {
scanf("%d", &type);
if (type == 0) {
scanf("%d%d", &a, &b);
Update(AIB, a, b);
}
else if (type == 1) {
scanf("%d%d", &a, &b);
Write << Query1(AIB, a, b) << '\n';
}
else {
scanf("%d", &a);
Write << Query2(AIB, a) << '\n';
}
}
}
int main() {
freopen(inFile, "r", stdin);
unsigned n;
unsigned m;
scanf("%d%d", &n, &m);
vector<unsigned> AIB(n + 1);
Build(AIB);
/*for (unsigned i = 1; i < AIB.size(); ++i) {
Write << Compute(AIB, i) << ' ';
}*/
ReadQueries(AIB, m);
return 0;
}