Pagini recente » Cod sursa (job #1352288) | Cod sursa (job #1973458) | Cod sursa (job #3254341) | Cod sursa (job #704991) | Cod sursa (job #2769507)
#include <fstream>
using namespace std;
ifstream cin ("datorii.in");
ofstream cout ("datorii.out");
const int maxn=100000;
int start, queryType, x, y, n, m;
int a[4*maxn];
void update(int newValue, int nod){
while(nod!=1){//cata vreme mai pot urca
nod/=2;//urcam un nod
a[nod]=a[2*nod]+a[2*nod+1];//actualizez cu maximul dinre fii
}
}
int query(int lo, int hi){
if(lo>hi)
return 0;
int leftValue=0, rightValue=0;
if(lo==hi)
return a[lo];
if(lo%2==1){
leftValue=a[lo];
lo++;
}
if(hi%2==0){
rightValue=a[hi];
hi--;//daca am include noduri noi, n-ar merge nimic, aa ca ne deplasam st-dr
}
lo/=2, hi/=2;//mergem un nivel mai sus
return leftValue + rightValue + query(lo, hi);
}
int main() {
cin >> n >> m;
start = 1;
while (start < n)
start <<= 1;
for(int i=start; i<start+n; i++){
cin>>a[i];
update(a[i], i);//actualizam arborele
}
for(int i=0; i<m; i++){
cin>>queryType>>x>>y;
if(queryType==1){//daca
cout<<query(x+start-1, y+start-1) << '\n';
}
else{
a[x + start - 1] -= y;
update(y, x+start-1);
}
}
return 0;
}