Cod sursa(job #2951494)

Utilizator MorarCezarMorar Cezar MorarCezar Data 6 decembrie 2022 17:21:49
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
const int N = 100005;
int n,q;
int segment_tree[N * 4],v[N];
void build(int node, int left, int right)
{
  if (left==right) {
    segment_tree[node]=v[left];
  } else {
    int middle=(left + right) / 2;

    build(node * 2, left, middle);
    build(node * 2 + 1, middle + 1, right);

    segment_tree[node] = segment_tree[node * 2] + segment_tree[node * 2 + 1];
  }
}

void update(int node, int left, int right, int day, int value)
{
  if (left == right) {
    segment_tree[node] -= value;
  } else {
    int middle = (left + right) / 2;

    if (day <= middle)
      update(node * 2, left, middle, day, value);
    else
      update(node * 2 + 1, middle + 1, right, day, value);

    segment_tree[node] = segment_tree[node * 2] + segment_tree[node * 2 + 1];
  }
}

int query(int node, int left, int right, int query_left, int query_right)
{
  if (query_left <= left and right <= query_right) {
    return segment_tree[node];
  } else {
    int middle = (left + right) / 2;

    if (query_right <= middle)
      return query(node * 2, left, middle, query_left, query_right);
    if (middle + 1 <= query_left)
      return query(node * 2 + 1, middle + 1, right, query_left, query_right);

    return query(node * 2, left, middle, query_left, query_right) +
           query(node * 2 + 1, middle + 1, right, query_left, query_right);
  }
}

int main()
{
    f>>n>>q;
    for(int i=1;i<=n;i++)
        f>>v[i];
    build(1,1,n);
    for(int i=1;i<=q;i++)
    {
        int op;
        f>>op;
        if(op==0)
        {
            int zi,val;
            f>>zi>>val;
            update(1,1,n,zi,val);
        }
        else{
            int zi,val;
            f>>zi>>val;
            g<<query(1,1,n,zi,val)<<"\n";
        }
    }
    return 0;
}