Cod sursa(job #2792066)

Utilizator Razvan48Capatina Razvan Nicolae Razvan48 Data 31 octombrie 2021 19:56:32
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.85 kb
#include <fstream>

using namespace std;

ofstream out("datorii.out");

class Parser
{
private:
  static const int BUFF_SIZE = 5000000;

  ifstream in;

  char buffer[BUFF_SIZE];

  int posBuff;

public:
  Parser(char* file)
  {
    in      = ifstream(file);
    posBuff = BUFF_SIZE - 1;
  }

  int getInt()
  {
    int rez = 0;

    while (!('0' <= buffer[posBuff] && buffer[posBuff] <= '9'))
    {
      posBuff++;

      if (posBuff == BUFF_SIZE)
      {
        posBuff = 0;
        in.read(buffer, BUFF_SIZE);
      }
    }

    while ('0' <= buffer[posBuff] && buffer[posBuff] <= '9')
    {
      rez = rez * 10 + buffer[posBuff] - '0';
      posBuff++;

      if (posBuff == BUFF_SIZE)
      {
        posBuff = 0;
        in.read(buffer, BUFF_SIZE);
      }
    }

    return rez;
  }
};

Parser input("datorii.in");

const int NMAX = 15000;

int aint[1+3*NMAX];

int v[1 + NMAX];

void build (int indexNod, int st, int dr)
{
    if (st == dr)
    {
        aint[indexNod] = v[st];
        return;
    }
    int indexFiuSt = 2 * indexNod;
    int indexFiuDr = 2 * indexNod + 1;
    int mij = (st+ dr) / 2;

    build(indexFiuSt, st, mij);
    build(indexFiuDr, mij+1 , dr);

    aint[indexNod] = aint[indexFiuSt] + aint[indexFiuDr];
}
void update(int indexNod, int st, int dr, int poz, int val)
{
    if(st == dr)
    {
        aint[indexNod] -= val;
        return;
    }
    int indexFiuSt = 2 * indexNod;
    int indexFiuDr = 2 * indexNod + 1;
    int mij = (st + dr)/2;

    if(poz <= mij)
        update(indexFiuSt, st, mij, poz, val);
    else
        update(indexFiuDr, mij + 1, dr, poz, val);
    aint[indexNod] = aint[indexFiuSt] + aint[indexFiuDr];
}
int query(int indexNod, int st, int dr, int stQuery, int drQuery)
{
    if( stQuery == st && drQuery == dr)
    {
        return aint[indexNod];
    }
    int indexFiuSt = 2 * indexNod;
    int indexFiuDr = 2 * indexNod + 1;
    int mij = (st + dr)/2;

    int sol;

    if (drQuery <= mij)
        sol = query(indexFiuSt, st, mij, stQuery, drQuery);
    else if(stQuery >= mij + 1)
        sol = query(indexFiuDr, mij + 1, dr, stQuery, drQuery);
        else
        sol = query(indexFiuSt, st, mij, stQuery, mij) + query(indexFiuDr, mij + 1, dr, mij + 1, drQuery);
    return sol;
}

int main()
{
    int n, m;
    n = input.getInt();
    m = input.getInt();
    for(int i = 1; i<= n; i++)
    {
        v[i] = input.getInt();
    }
    build(1,1,n);
    for( int j = 1; j <= m; j++)
    {
        int tipOperatie, a, b;
	   tipOperatie = input.getInt();
        a = input.getInt();
        b = input.getInt();
        if (tipOperatie == 0)
        {
            update(1, 1, n, a, b);
        }
        else
        {
            out << query(1, 1, n, a, b) << '\n';
        }
    }
    return 0;
}