Pagini recente » Cod sursa (job #2132674) | Cod sursa (job #2309931) | Cod sursa (job #3150452) | Cod sursa (job #1685526) | Cod sursa (job #2386592)
#include <iostream>
#include <fstream>
#include <cmath>
#define zeros(x) ( (x ^ (x - 1)) & x )
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
int n, v[15000], m, arbint[1000000], k, nn;
void modifPos(int pos, int val){
while(pos > 1){
arbint[pos]-=val;
if(arbint[pos] < 0)
arbint[pos] = 0;
pos/=2;
}
arbint[1] -= val;
if(arbint[1] < 0)
arbint[1] = 0;
return;
}
int findOnInterval(int a, int b, int pos = 1, int aa = 1, int ab = k){
if((aa == a && b == ab) || (aa == ab))
return arbint[pos];
int mij = (aa + ab) / 2;
if(a>mij && b>mij)
return findOnInterval(a, b, pos * 2 + 1, mij + 1, ab);
else if(a<= mij && b<=mij)
return findOnInterval(a, b, pos * 2, aa, mij);
return findOnInterval(a, b, pos * 2, aa, mij) + findOnInterval(a, b, pos * 2 +1, mij + 1, ab);
}
int main()
{
f>>n>>m;
for(int i=1; i<=n; i++){
f>>v[i];
}
k = (int)log2(n) + 2;
nn = (1<<k);
k = (1<<(k-1));
for(int i=nn-k-1, j=0; i<nn; i+=2, j+=2){
arbint[i] = v[j], arbint[i+1]=v[j+1];
}
for(int lvl = (k >> 1); lvl >= 1; lvl = (lvl >> 1)){
for(int i=lvl; i<(lvl<<1); i++){
arbint[i] = arbint[i * 2] + arbint[i * 2 + 1];
}
}
for(int i=0; i<m; i++){
int a, b, code;
f>>code>>a>>b;
if(code == 0){
a+=k-1;
modifPos(a, b);
continue;
}
g<<findOnInterval(a, b)<<"\n";
}
}