Cod sursa(job #2388504)

Utilizator RazvanPanaiteRazvan Panaite RazvanPanaite Data 26 martie 2019 09:29:24
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <bits/stdc++.h>
#define DMAX 15010

using namespace std;

ifstream fin("datorii.in");
ofstream fout("datorii.out");

int V[DMAX];
int AI[4*DMAX];
int laz[4*DMAX];

int n,m;

void build(int node,int st,int dr);
void lazy(int node,int st,int dr,int x,int y,int val);
int query(int node,int st,int dr,int x,int y);

int main()
{int i,op,x,y;
 fin>>n>>m;
 for(i=1;i<=n;i++)
     fin>>V[i];
 build(1,1,n);
 for(i=1;i<=m;i++)
     {fin>>op>>x>>y;
      if(!op)
         lazy(1,1,n,x,x,-y);
         else
         fout<<query(1,1,n,x,y)<<'\n';
     }
 return 0;
}
void build(int node,int st,int dr)
{if(st==dr)
    {AI[node]=V[st];
     return;
    }
 int mij=(st+dr)/2;
 build(2*node,st,mij);
 build(2*node+1,mij+1,dr);
 AI[node]=AI[2*node]+AI[2*node+1];
}
void lazy(int node,int st,int dr,int x,int y,int val)
{if(laz[node] && st!=dr)
    {int mij=(st+dr)/2;
     laz[2*node]+=laz[node];
     AI[2*node]+=laz[node]*(mij-st+1);
     laz[2*node+1]+=laz[node];
     AI[2*node+1]+=laz[node]*(dr-mij);
     laz[node]=0;
    }
 if(st>=x && dr<=y)
    {laz[node]+=val;
     AI[node]+=val*(dr-st+1);
     return;
    }
 int mij=(st+dr)/2;
 if(x<=mij)
    lazy(2*node,st,mij,x,y,val);
 if(y>mij)
    lazy(2*node+1,mij+1,dr,x,y,val);
 AI[node]=AI[2*node]+AI[2*node+1];
}
int query(int node,int st,int dr,int x,int y)
{int mij=(st+dr)/2,ans=0;
 if(laz[node] && st!=dr)
    {laz[2*node]+=laz[node];
     AI[2*node]+=laz[node]*(mij-st+1);
     laz[2*node+1]+=laz[node];
     AI[2*node+1]+=laz[node]*(dr-mij);
     laz[node]=0;
    }
 if(st>=x && dr<=y)
    return AI[node];
 if(x<=mij)
    ans+=query(2*node,st,mij,x,y);
 if(y>mij)
    ans+=query(2*node+1,mij+1,dr,x,y);
 return ans;
}