Pagini recente » Cod sursa (job #7435) | Cod sursa (job #23705) | Cod sursa (job #3192839) | Cod sursa (job #1359172) | Cod sursa (job #1028020)
#include<fstream>
#define maxn 16385
using namespace std;
ifstream in("datorii.in"); ofstream out("datorii.out");
int n,m,x,tip,a,b,c[maxn];
void build(int poz, int val){
for(int i=poz; i<=n; i+= (i & -i))
c[i]+=val; //
}
void update(int poz, int val){
for(int i=poz; i<=n; i+= (i & -i))
c[i]-=val; //la update mergem spre dreapta cu i-ul, la query spre stanga (sa ajungem la acel (1,1))
}
void query(int st, int dr){
int s=0;
for(int i=dr; i; i-=( i & -i)) //la fel ca la sumele partiale, calculam sum(dr) si sum(st-1) si le facem diferenta
s+=c[i]; // i & -i e 2 la puterea nr de 0-uri terminale din repr. in baza 2 a lui i (LSB(i))
for(int i=st-1; i; i-= (i & -i))
s-=c[i];
out<<s<<'\n';
}
int main(){
in>>n>>m;
for(int i=1;i<=n;++i){
in>>x;
if(x) //if (x) ca daca e 0 se cam buleste
build(i,x); //ziua i are valoarea x, la fel ca toate celalalte din arbore (vezi pag.101)
}
for(int i=1;i<=m;++i){
in>>tip>>a>>b;
if(!tip)
update(a,b);
else
query(a,b);
}
out.close();
return 0;
}