Cod sursa(job #759714)

Utilizator Theorytheo .c Theory Data 18 iunie 2012 23:42:47
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include<fstream>
#define nmax 60006
#define max(a,b) (a > b ? a : b)
#define min(a,b) (a > b ? b : a)
#define nod_st (nod * 2)
#define nod_dr (nod * 2 + 1)
#define ll long long
using namespace std;

ifstream fin("datorii.in");
ofstream fout("datorii.out");

long long  N, start, finish, v[nmax], poz, val, S, maxi;
ll F[nmax];//suma max a primelor elemente din interval
ll L[nmax];//suma max a ultimelor elemente din interval
ll sum[nmax];//suma toatala
ll M[nmax];//suma maxima oriunde in interval

void update(int nod, int st, int dr)
{
     if(st == dr)//se ajunge in nod elementar
     {

         sum[nod] = v[st];
         return;

     }
     int mij = (st + dr)/2;
     update(nod_st, st, mij);
     update(nod_dr, mij + 1, dr);

     sum[nod] = sum[nod_st] + sum[nod_dr];

}

void change(int nod, int st, int dr)
{
    if(st == dr)
    {
         sum[nod] = val;
         return;
    }
    int mij = (st + dr) / 2;
    if(mij >= poz)
    change(nod_st, st, mij);
        else
    change(nod_dr, mij + 1, dr);

     sum[nod] = sum[nod_st] + sum[nod_dr];
}

void query(int nod, int st, int dr)
{
    if(start <= st && dr <= finish)//intervalele sunt disjuncte si sunt parcurse de la st la dreapta
    {

       S += sum[nod];
        return ;
    }
    int mij = (st +dr)/2;
    if(start <= mij)   query(nod_st, st, mij);
    if(finish > mij)   query(nod_dr, mij + 1, dr);

}
void read()
{
    int nr;
    fin>> N >>nr;
    for(int i = 1; i <= N;i++)
        fin >>v[i];
    update(1, 1, N);
   // for(int i = 1; i <= N;i++)
    //    fout << sum[i] <<" ";
    for(int i = 1; i <= nr; i++)
    {
        int tip;
        fin >>tip;
        if( tip == 0)
        {
            fin >> poz>> val;
            val = v[poz] - val;
            change(1,1,N);
        }
        if(tip == 1)
        {
            fin>>start >> finish;
            S = 0;
            query(1, 1, N);
            fout << S <<'\n';

        }
    }

}
int main()
{
    read();
    fin.close();
    return 0;
}