Cod sursa(job #1895255)

Utilizator nick12nicolae mihalache nick12 Data 27 februarie 2017 21:01:17
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <bits/stdc++.h>

using namespace std;
#define RR 50003
//#define CC 250000
#define N 50003
#define oo 1000000000
#define pp pair<int,int>
#define RRR ios_base::sync_with_stdio(false);cin.tie(0);

int ar[4*200001];
int v[200001];
int n;
void updateval(int s,int e,int in,int diff, int node)
{
    if (in < s || in > e)
        return ;
    ar[node] = ar[node] + diff;
    if (s != e)
    {
        int mid = (s+e)/2;
        updateval(s,mid,in,diff,node*2);
        updateval(mid+1,e,in,diff,node*2+1);
    }
}
void update(int node,int s,int e,int in, int val)
{

   int mid = (s+e)/2;
   if (s  == e)
   {
        ar[node] +=val;
        return ;
   }
   if (in <= mid)
    update(2*node,s,mid,in,val);
   if (in > mid) update(2*node+1,mid+1,e,in,val);
   ar[node] = ar[node*2] + ar[node*2+1];

}

int build(int node,int s,int e)
{

    if (e == s)
      {
          ar[node] = v[s];
          return ar[node];
      }
    else
    {
        int mid = (e+s)/2;
        ar[node] = build(node*2,s,mid) + build(node*2+1,mid+1,e);
        return ar[node];
    }
}
int maxim = -1;
int query(int node,int s, int e, int l, int r)
{
    if (l > r)
        return 0;
    if (l == s && r == e)
        return ar[node];
    int mid = (s+e)/2;
    if (r <= s)
        return query(2*node,s,mid,l,r);
    if (l >mid)
        return query(2*node+1,mid+1,e,l,r);
    return query(2*node,s,mid,l,min(mid,r)) + query(2*node+1,mid+1,e,max(l,mid+1),r);

}

int main()
{
    RRR
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
    int m;
    cin >> n >> m;
    for (int i=1;i<=n;i++)
    {
        int z;
        cin >> z;
        v[i] = z;

    }
    build(1,1,n);

    for (int i=0;i<m;i++)
    {
        int a,b,c;
        maxim = -1;
        cin >> a >> b >> c;
        if (a == 0)
            update(1,1,n,b,c*-1);
        else {
           cout <<  query(1,1,n,b,c);
            cout << "\n";
        }
    }
    return 0;
}