Cod sursa(job #2308904)

Utilizator stan_flaviusStan Flavius Stefan stan_flavius Data 27 decembrie 2018 23:17:41
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <fstream>
#define nmax 15001

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

int v[nmax],n,m;
int tree[nmax*10];

void BuildTree(int pos,int val,int node,int left,int right)
{ if(left==right) {tree[node]=val; return;}
  int mid=(left+right)/2;
  if(pos<=mid) BuildTree(pos,val,node*2,left,mid);
  else BuildTree(pos,val,node*2+1,mid+1,right);
  tree[node]=tree[node*2]+tree[node*2+1];
}

void Achitare(int pos,int node,int left,int right)
{ if(left==pos && right==pos) {tree[node]=v[pos]; return; }
  int mid=(left+right)/2;
  if(pos<=mid) Achitare(pos,node*2,left,mid);
  else Achitare(pos,node*2+1,mid+1,right);
  tree[node]=tree[node*2]+tree[node*2+1];
}

void Interogare(int left,int right,int in,int fin,int &sum,int node)
{ if(in<=left && right<=fin)
     {sum+=tree[node]; return;}
  int mid=(left+right)/2;
  if(in<=mid) Interogare(left,mid,in,fin,sum,node*2);
  if(mid<fin) Interogare(mid+1,right,in,fin,sum,node*2+1);
}

int main()
{ int i,q,a,b;
  fin>>n>>m;
  for(i=1; i<=n; i++)
      { fin>>v[i];
        BuildTree(i,v[i],1,1,n);
      }

  for(i=1; i<=m; i++)
      { fin>>q>>a>>b;
        if(q==0)
            { v[a]-=b;
              Achitare(a,1,1,n);
            }
        else {int sum=0;
              Interogare(1,n,a,b,sum,1);
              fout<<sum<<"\n";
             }
      }
    return 0;
}