Cod sursa(job #2980997)

Utilizator MemeComan Mihai Matei Meme Data 17 februarie 2023 00:47:06
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");
const int MAX = 1 << 14;
int t[MAX];

void constructie(int p, int st, int dr){
  if(st == dr){
    in >> t[p];
    return;
  }
  int m = (st + dr) / 2, fs = 2 * p, fd = 2 * p + 1;
  constructie(fs, st, m);
  constructie(fd, m + 1, dr);
  t[p] = t[fs] + t[fd];
}

void actualizare(int p, int st, int dr, int poz, int val){
  if(st == dr){
    t[p] -= val;
    return;
  }
  int m = (st + dr) / 2, fs = 2 * p, fd = 2 * p + 1;
  if(poz <= m) //daca elem cautat este in partea stanga acualiez doar stanga
    actualizare(fs, st, m, poz, val);
  else // daca elem cautat e in partea dreapta acualizez doar dreapta
    actualizare(fd, m + 1, dr, poz, val);
  t[p] = t[fs] + t[fd];
}
int interogare(int p, int st, int dr, int a, int b){
  if(a <= st && dr <= b){
    return t[p];
  }
  int m = (st + dr) / 2, fs = 2 * p, fd = 2 * p + 1;
  int rezs = 0, rezd = 0;
  if(a <= m){
    rezs = interogare(fs, st, m, a, b);
  }
  if(m + 1 <= b){
    rezd = interogare(fd, m + 1, dr, a, b);
  }
  return rezs + rezd;
}

int main()
{
    int n, m;
    in >> n >> m;
    constructie(1, 1, n);
    int x;
    for(int i = 0; i < m; i++){
      in >> x;
      if(x == 1){
        int a, b;
        in >> a >> b;
        out << interogare(1, 1, n, a, b) << endl;
      }
      else{ //scad suma
        int poz, val;
        in >> poz >> val;
        actualizare(1, 1, n, poz, val);
      }
    }
    return 0;
}