Cod sursa(job #2508234)

Utilizator eusebiu_alexandruMorar Eusebiu eusebiu_alexandru Data 11 decembrie 2019 19:39:39
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<fstream>
#define nmax 15005
using namespace std;
ifstream f ("datorii.in");
ofstream g ("datorii.out");
int v[4*nmax],i,j,st,dr,a,b,valori[nmax],valoare,pozitie,maxi=-1,mij,n,m,cerinta,suma;
void update(int nod,int st,int dr)
{
    if(st==dr)
    {
        v[nod]=valoare;
       return;
    }
      int  mij=(st+dr)/2;
    if(pozitie<=mij)
       update(2*nod,st,mij);
    else
       update(2*nod+1,mij+1,dr);
    v[nod]=v[nod*2]+v[nod*2+1];
}
void update1(int nod,int st,int dr)
{
    if(st==dr)
    {
        v[nod]-=valoare;
       return;
    }
      int  mij=(st+dr)/2;
    if(pozitie<=mij)
       update1(2*nod,st,mij);
    else
       update1(2*nod+1,mij+1,dr);
    v[nod]=v[nod*2]+v[nod*2+1];
}
void query(int nod,int st,int dr)
{
    if(a<=st && dr<=b)
    {
     suma+=v[nod];
     return;
    }
       int  mij=(st+dr)/2;
        if(a<=mij)
           query(nod*2,st,mij);
        if(b>mij)
            query(nod*2+1,mij+1,dr);
}
int main()
{
   f>>n>>m;
   for(i=1;i<=n;i++)
   {
       f>>valoare;
       pozitie=i;
       update(1,1,n);
   }
   for(i=1;i<=m;i++)
   {
       f>>cerinta;
       if(cerinta==1)
       {
           f>>a>>b;
           suma=0;
           query(1,1,n);
           g<<suma<<'\n';
       }
       else
       {
           f>>pozitie>>valoare;
           update1(1,1,n);
       }
   }
}