Cod sursa(job #2515946)

Utilizator Adrian.TrillMititean Adrian Adrian.Trill Data 29 decembrie 2019 20:38:28
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.92 kb
#include <fstream.h>
#include <iostream.h>
#define lg 100005
int init[lg],t[4lg+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,2poz);
      construiesc(x+1,dr,2poz+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;
}
}
//**INTEROGARE
void interogare(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;
                 interogare(st,x,poz2);
                 interogare(x+1,dr,poz2+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);
        }

//**EFECTUARE TESTE
for(i=1;i<=m;i++)
 {
                   f>>x>>a>>b;
                 //  cout<<"am citit"<<x<<" "<<a<<" "<<b;
                   //system("pause");

                   if (x==1)
                   {rez=0;
                    interogare(1,n,1);
                    g<<rez<<"\n";
                    }

                    else
                    if (x==0)
                       actualizare2(a,b);
}
f.close();
g.close();
return 0;
}
REZOLVARE CU AIB
#include <fstream>

#define zeros(x)((x^(x-1))&x)

#define NMAX 15005

int aib[NMAX];

int n;

void Add(int x,int val)

{

for(int i=x; i<=n; i+=zeros(i))

aib[i]+=val;

}

int Compute(int x)

{

int suma=0;

for(int i=x; i; i-=zeros(i))

suma+=aib[i];

return suma;

}

using namespace std;

ifstream cin("datorii.in");

ofstream cout("datorii.out");

int main()

{

ios_base::sync_with_stdio(0);

cin.tie();

int m,a,q,x,y;

cin>>n>>m;

for(int i=1; i<=n; ++i)

{

cin>>a;

Add(i,a);

}

for(int i=1; i<=m; ++i)

{

cin>>q;

if(q==0)

{

cin>>x>>a;

Add(x,-a);

}

else if(q==1)

{

cin>>x>>y;

cout<<Compute(y)-Compute(x-1)<<"\n";

}

}

return 0;

}
Modificat sursa la prob datorii
#include <fstream>
#include <iostream>

int init[100005],t[100000005],a,b,rez,x;

inline int max(int a,int b)
 {
 return a>b?a:b;}
void arbore(int st,int dr,int poz)
{
      if (st==dr)
        {init[st]=poz;
        return ;
        }

       x=(st+dr)/2;
      arbore(st,x,2poz);
      arbore(x+1,dr,2poz+1);
}
void a1(int poz,int val)
  {
     int x=init[poz];
     t[x]=val;
     x>>=1;
     while(x)
     {t[x]=t[x]+val;
      x>>=1;
    }
}


void a2(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 interogare(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;
                 interogare(st,x,poz2);
                 interogare(x+1,dr,poz2+1);
                 }
}

int main()
{int i,x,n,m;
     ifstream f("datorii.in");
     ofstream g("datorii.out");
     f>>n>>m;

     arbore(1,n,1);

     for(i=1;i<=n;i=i+1)
      {f>>x;
        a1(i,x);
        }


for(i=1;i<=m;i++)
 {
                   f>>x>>a>>b;

                   if (x==1)
                   {rez=0;
                    interogare(1,n,1);
                    g<<rez<<"\n";
                    }
                    else
                    if (x==0)
                       a2(a,b);
}
f.close();
g.close();
return 0;
}