Cod sursa(job #2568568)

Utilizator luisavluisa v luisav Data 4 martie 2020 03:33:26
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");
int val,poz;
int v[200002];
int partea;
long long sum[200001];
void actualizare(int nod,int st,int dr){
if(st==dr){
if(partea==0){
 sum[nod]=val;v[nod]=val;
}
else if(partea==1){
    int valoare=v[nod]-val;
     sum[nod]=valoare;v[nod]=valoare;
}
}
else{

    int mij=(st+dr)/2;
    if(poz<=mij)actualizare(nod*2,st,mij);
    else actualizare(nod*2+1,mij+1,dr);
    v[nod]=max(v[nod*2],v[nod*2+1]);
    sum[nod]=sum[nod*2]+sum[nod*2+1];
    //cout<<nod<<" "<<sum[nod]<<endl;
}


}
int a,b,rez;
int nodord;
int sumaint;
void intreaba(int nod,int st,int dr){
  //  if(st==dr&&a<=st&&st<=b)cout<<v[nod]<<" ";

    if(a<=st&&dr<=b) {//cout<<nod<<" "<<sum[nod]<<".. ";
    if(rez<v[nod])rez=v[nod];
    sumaint+=sum[nod];
    }
else{
    int mij=(st+dr)/2;
    if(a<=mij)intreaba(nod*2,st,mij);
    if(mij<b)intreaba(2*nod+1,mij+1,dr);

}
   }
int n,m;




int main()
{
  in>>n;
  for(int i=1;i<=n;i++)
  {
      int x;
      in>>x;

      val=x;
      poz=i;

      actualizare(1,1,n);
//cout<<sum[1]<<" ";
      //cout<<"///////////"<<endl;


  }


  //for(int i=1;i<=25;i++)cout<<sum[i]<<" ";
 // cout<<endl<<endl;
  partea++;
  in>>m;
  for(int i=1;i<=m;i++){
        int q;
    in>>q;
    if(q==0){
        in>>poz>>val;
        actualizare(1,1,n);
//for(int ii=1;ii<=25;ii++)cout<<sum[ii]<<" ";cout<<endl<<endl;
    }
    if(q==1){
        in>>a>>b;
        rez=0;
        sumaint=0;
        intreaba(1,1,n);

      //  cout<<af<<endl;
     // cout<<rez<<" / "<<" "<<sumaint;cout<<endl<<endl;
     out<<sumaint<<'\n';
    }
  }
    return 0;
}