Cod sursa(job #1876874)

Utilizator tiberiumunteanMuntean Tiberiu tiberiumuntean Data 12 februarie 2017 18:28:50
Problema Datorii Scor 100
Compilator cpp Status done
Runda becreative11 Marime 1.38 kb
#include <fstream>
#include <iostream>
#define lg 100005
using namespace std;
int init[lg],t[4*lg+200],a,b,rez;
inline int max(int a,int b)
 {
 return a>b?a:b;}

//costr arb
void construiesc(int st,int dr,int poz)
{
      if (st==dr)
        {init[st]=poz;
        return ;
        }

      int x=(st+dr)/2;
      construiesc(st,x,2*poz);
      construiesc(x+1,dr,2*poz+1);
      }

//********ACTUALIZARE
void actualizare(int poz,int val)
{
     int x=init[poz];
     t[x]=val;
     x>>=1;
     while(x)
     {t[x]=t[x]+val;
      x>>=1;
}
}


void actualizare2(int poz,int val)
{
     int x=init[poz];
     t[x]=t[x]-val;
    x>>=1;
     while(x)
     {t[x]=t[x]-val;
      x>>=1;
}
}

void interog(int st,int dr,int poz)
{
    if (st>b||dr<a) return;
     if (a<=st&&dr<=b)
    rez=rez+t[poz];
    else
    if(st<dr){
    int x=(st+dr)/2;
    interog(st,x,poz*2);
    interog(x+1,dr,poz*2+1);
}
}

int main()
{int i,x,n,m;
     ifstream f("datorii.in");
     ofstream g("datorii.out");
     f>>n>>m;
     construiesc(1,n,1);
      for(i=1;i<=n;i=i+1){
      f>>x;
        actualizare(i,x);
        }

for(i=1;i<=m;i++)
 {
    f>>x>>a>>b;
    if (x==1){
        rez=0;
        interog(1,n,1);
        g<<rez<<"\n";
                    }
            else if (x==0)
            actualizare2(a,b);
}
f.close();
g.close();
return 0;
}