Nu aveti permisiuni pentru a descarca fisierul grader_test3.ok
Cod sursa(job #3258049)
Utilizator | Data | 20 noiembrie 2024 18:09:12 | |
---|---|---|---|
Problema | Datorii | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva de probleme | Marime | 1.43 kb |
#include <bits/stdc++.h>
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int st,dr,t,n,q,i,d,val;
int debt[15001];
int tr[15000*4];
void build(int nod, int st, int dr){
if (st==dr){
tr[nod]=debt[st];
}else{
int mid=(st+dr)/2;
build(nod*2,st,mid);
build(nod*2+1, mid+1,dr);
tr[nod]=tr[nod*2]+tr[nod*2+1];
}
}
void update(int nod, int st, int dr, int day, int value){
if(st==dr){
tr[nod]-=value;
}else{
int mid=(st+dr)/2;
if(day<=mid)
update(nod*2,st,mid,day,value);
else
update(nod*2+1,mid+1,dr, day, value);
tr[nod]=tr[nod*2]+tr[nod*2+1];
}
}
int query(int nod, int st, int dr, int query_left, int query_right){
if (query_left <=st && dr<=query_right){
return tr[nod];
}else{
int mid=(st+dr)/2;
if (query_right<=mid)
return query(nod*2,st,mid,query_left,query_right);
if (mid+1<=query_left)
return query(nod*2+1,mid+1,dr,query_left,query_right);
return query(nod*2,st,mid,query_left,query_right) +
query(nod*2+1,mid+1,dr,query_left,query_right);
}
}
int main(){
fin>>n>>q;
for(i=1;i<=n;i++)
fin>>debt[i];
build(1,1,n);
while(q--){
fin>>t;
if(t==0){
fin>>d>>val;
update(1,1,n,d,val);
}else{
fin>>st>>dr;
fout<<query(1,1,n,st,dr)<<"\n";
}
}
}