Pagini recente » Cod sursa (job #1829724) | Cod sursa (job #1463602) | Cod sursa (job #1493538) | Cod sursa (job #2754222)
#include<bits/stdc++.h>
using namespace std;
int administrare[45000];
int poz,bani,s;
void update(int zi, int st, int dr) ///creare arbore de intervale
{
if(st==dr)
{
administrare[zi]+=bani;
return;
}
int mij=(st+dr)/2;
if(poz<=mij)
update(2*zi,st,mij);
else
update(2*zi+1,mij+1,dr);
administrare[zi]=administrare[2*zi]+administrare[2*zi+1];
}
void suma(int zi, int st, int dr, int a, int b)
{ int mij=(st+dr)/2;
if(a<=st && dr<=b) ///am terminat de parcurs si putem aduna valoarea zilei la suma
{ s+=administrare[zi];
return ;
}
if(a<=mij)
suma(2*zi,st,mij,a,b);
if(b>mij)
suma(2*zi+1,mij+1,dr,a,b);
}
int main()
{
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int n,m,p,q,operatie,i;
fin>>n>>m;
for(i=1;i<=n;i++)
{
fin>>bani;
poz=i;
update(1,1,n);
}
for(i=1;i<=m;i++)
{
fin>>operatie>>p>>q;
if(operatie==0)
{
bani=-q,poz=p;
update(1,1,n); ///daca operatia este 0 atunci facem scaderea din pozitia p
}
else
{ s=0;
suma(1,1,n,p,q);
fout<<s<<"\n";
}
}
return 0;
}