Pagini recente » Cod sursa (job #1555542) | Cod sursa (job #1547596) | Cod sursa (job #192478) | Cod sursa (job #2210209) | Cod sursa (job #3258078)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int offset = 1;
void segmentTreeInit(vector<int> &segmentTree, int noElements) {
while(offset < noElements)
offset*=2;
segmentTree.resize(2*offset);
for(int i=0; i<noElements; i++) {
fin >> segmentTree[offset+i];
}
for(int i=offset-1; i>=1; i--)
segmentTree[i] = segmentTree[2*i]+segmentTree[2*i+1];
}
void Update(int poz, int val, vector<int> &segmentTree) {
int node = offset + poz - 1;
segmentTree[node] -= val;
node/=2;
while(node) {
segmentTree[node] = segmentTree[2*node] + segmentTree[2*node+1];
node/=2;
}
}
int Query(int node, int currentLeft, int currentRight, int targetLeft, int targetRight, vector<int> &segmentTree) {
if(targetLeft <= currentLeft && currentRight <= targetRight)
return segmentTree[node];
int rez = 0;
int mid = (currentLeft + currentRight) / 2;
int node1 = node*2;
int node2 = node*2+1;
int node1Left = currentLeft;
int node1Right = mid;
int node2Left = mid+1;
int node2Right = currentRight;
if(node1Right >= targetLeft)
rez += Query(node1, node1Left, node1Right, targetLeft, targetRight, segmentTree);
if(node2Left <= targetRight)
rez += Query(node2, node2Left, node2Right, targetLeft, targetRight, segmentTree);
return rez;
}
int main() {
int noElements, noQueries;
vector<int> segmentTree;
fin >> noElements >> noQueries;
segmentTreeInit(segmentTree, noElements);
while(noQueries--) {
int operation, left, right;
fin >> operation >> left >> right;
if(operation == 0)
Update(left, right, segmentTree);
else
fout << Query(1, 1, offset, left, right, segmentTree) << endl;
}
}