Cod sursa(job #783045)

Utilizator bratualexBratu Alexandru bratualex Data 2 septembrie 2012 00:51:30
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <fstream>

using namespace std;
ifstream fin ("datorii.in");
ofstream fout ("datorii.out");
void initializare ( int, int , int ,int ,int ,int);
void actualizare ( int , int , int , int , int , int );
int interogare ( int , int ,int , int , int );
int v[60000];
int main()
{
    int i,n,m,y,z,t;
    fin>>n>>m;
    for (i=1;i<=n;i++)
    {
        fin>>y;
        initializare (1,i,i,1,n,y);
    }
    //for (i=0;i<=n*n;i++)
    //    fout<<v[i]<<" ";
    for (i=1;i<=m;i++)
    {
        fin>>y>>z>>t;
        if (!y)
        {
            actualizare (1,z,z,1,n,t);
        }
        else
        {
            fout<<interogare(1,z,t,1,n)<<"\n";
        }
    }
    //fout<<"\n";
    //for (i=0;i<=n*n;i++)
        //fout<<v[i]<<" ";
    return 0;
}


void initializare ( int ind , int a, int b, int stg , int dr , int x )
{
    int mid;
    if (a<=stg && b>=dr )
    {

        v[ind]=x;
    }
    else
    {
        mid=(stg+dr)/2;
        if (a<=mid)
            initializare ( ind*2,a,b,stg,mid,x);
        if (b>mid)
            initializare ( ind*2+1,a,b,mid+1,dr,x);
        v[ind]=v[ind*2]+v[ind*2+1];
    }
}


void actualizare ( int ind , int a , int b , int stg , int dr , int x)
{
    int mid;
    if (a<=stg && b>=dr )
    {

        v[ind]=v[ind]-x;
    }
    else
    {
        mid=(stg+dr)/2;
        if (a<=mid)
            actualizare ( ind*2,a,b,stg,mid,x);
        if (b>mid)
            actualizare ( ind*2+1,a,b,mid+1,dr,x);
        v[ind]=v[ind]-x;
    }
}

int interogare ( int ind , int a ,int b , int stg , int dr )
{
    int s=0,d=0,mid;
    if (a<=stg&&b>=dr)
    {
        return v[ind];
    }
    else
    {
        mid=(stg+dr)/2;
        if (a<=mid)
            s=interogare ( ind*2,a,b,stg,mid);
        if (b>mid)
            d=interogare (ind*2+1,a,b,mid+1,dr);
        return s+d;
    }
}