Pagini recente » Cod sursa (job #2541387) | Cod sursa (job #2902330)
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize ("unroll-loops")
#include <fstream>
#define s 100001
#define arbs 400004
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
long long n,m,op,v[s];
struct nod{
long long lower,upper,mx;
};
nod arb[arbs];
void create_nod(long long st,long long dr,long long nr)
{
if(st == dr) {
arb[nr].mx = v[dr];
arb[nr].lower = st;
arb[nr].upper = st;
return;
}
else
{
long long mij = (st+dr)/2;
create_nod(st,mij,2*nr+1);
create_nod(mij+1,dr,2*nr+2);
arb[nr].mx = arb[(nr<<1)+1].mx+arb[(nr<<1)+2].mx;
arb[nr].lower = arb[(nr<<1)+1].lower;
arb[nr].upper = arb[(nr<<1)+2].upper;
}
}
long long maxim(long long i,long long j,long long nr)
{
if(j<arb[nr].lower || i> arb[nr].upper)
return 0;
if(i<= arb[nr].lower && j>= arb[nr].upper)
return arb[nr].mx;
return (maxim(i,j,(nr<<1)+1) + maxim(i,j,(nr<<1)+2));
}
void update(long long a,long long b,long long nr) {
if(a<arb[nr].lower || a>arb[nr].upper)
return;
else if(arb[nr].lower == arb[nr].upper)
{arb[nr].mx -= b;return;}
if(a<=(arb[nr].lower+arb[nr].upper)/2)
update(a,b,(nr<<1)+1);
else
update(a,b,(nr<<1)+2);
arb[nr].mx = arb[(nr<<1)+1].mx + arb[(nr<<1)+2].mx;
}
int main()
{
f>>n>>m;
long long i;
for(i = 0;i<n;i++)
{
f>>v[i];
}
long long a,b;
create_nod(0,n-1,0);
for(i = 0;i<m;i++)
{
f>>op>>a>>b;
switch (op) {
case 1: {
g<<maxim(a-1, b-1,0)<<'\n';
break;
}
case 0: {
update(a-1, b,0);
break;
}
}
}
}