Cod sursa(job #1096192)

Utilizator octavdOctavian Dumitrascu octavd Data 1 februarie 2014 17:46:02
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.6 kb
#include <cstdio>
#define dim 1<<14
using namespace std;
int A[dim],ARB[2*dim],N,M,i,j,x,y,max1,tip,s;

int max(int x,int y)
{
    if (x>=y) return x;
    else return y;
}

void Update(int nod, int st, int dr,int poz,int val)
{
    if (st==dr) //daca in ARB tin minte informatii descpre un interval elementar
        {
            ARB[nod]=val;//aici apar modificari in ARB
        }
    else
    {
        int m=(st+dr)/2;
        if (poz<=m) Update(nod*2,st,m,poz,val); //aici actualizam fiul standa
        else  Update(nod*2+1,m+1,dr,poz,val);   //aici actualizam fiul dreapta
        ARB[nod]=ARB[nod*2]+ARB[nod*2+1]; //aici apar modificari in ARB am facut maximul dintre cei doi fii
    }
}


void Update_cu_scadere(int nod, int st, int dr,int poz,int val)
{
    if (st==dr) //daca in ARB tin minte informatii descpre un interval elementar
        {
            ARB[nod]-=val;//aici apar modificari in ARB
        }
    else
    {
        int m=(st+dr)/2;
        if (poz<=m) Update_cu_scadere(nod*2,st,m,poz,val); //aici actualizam fiul standa
        else  Update_cu_scadere(nod*2+1,m+1,dr,poz,val);   //aici actualizam fiul dreapta
        ARB[nod]=ARB[nod*2]+ARB[nod*2+1]; //aici apar modificari in ARB am facut maximul dintre cei doi fii
    }
}

void query(int nod, int st, int dr, int a, int b)
{
    if (a<=st&&dr<=b) //daca [st,dr] e inclus in [a,b] returnez informatia dorita , adica fac un maxim
        {
             s+=ARB[nod]; //aici apar modificari la interogari
        }
    else
    {
        int m=(st+dr)/2;
        if (a<=m) query(nod*2,st,m,a,b); //interogare fiu st
        if (m+1<=b) query (nod*2+1,m+1,dr,a,b); //interogare fiu dreapta
    }
}

void afis(int nr)
{
    for (int i=1;i<=nr;i++)
        printf("%d ",ARB[i]);
    printf("\n");
}


int main()
{
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
    scanf("%d%d\n",&N,&M);
    for (i=1;i<=N;i++)
        {
            scanf("%d",&x);
            Update(1,1,N,i,x);
         //   printf("%d ",x);
        }
   // printf("\n");
   // afis(2*N-1);
    //return 0;
    while (M>0)
        {
            M--;
            scanf("%d%d%d",&tip,&x,&y);
            if (tip==0)
                {
                    Update_cu_scadere(1,1,N,x,y);
     //               printf("\n scadem %d pe pozitia %d \n",x,y);
     //               afis(2*N-1);
                }
            else
            {
                s=0;
                query(1,1,N,x,y);
      //          afis(2*N-1);
                printf("%d\n",s);
            }
        }
    return 0;
}