Cod sursa(job #2289191)

Utilizator alex_bb8Banilean Alexandru-Ioan alex_bb8 Data 24 noiembrie 2018 11:52:07
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <fstream>
#include <bits/stdc++.h>
#define Nmax 100005
using namespace std;

ifstream f("datorii.in");
ofstream g("datorii.out");

int A[4*Nmax-1],v[Nmax],n,m;

void build(int l,int r,int node)
{
  if(l==r) A[node]=v[l];
  else
  {
    int m=(l+r)/2;
    build(l,m,2*node);
    build(m+1,r,2*node+1);
    A[node]=A[2*node]+A[2*node+1];
  }
}

int poz;

void update(int l,int r,int node)
{
 if(l==r) A[node]=v[l];
 else
 {
  int m=(l+r)/2;
  if(poz<=m) update(l,m,2*node);
  else update(m+1,r,2*node+1);
  A[node]=A[2*node]+A[2*node+1];
 }
}

int s,d;

int query(int l,int r,int node)
{
 if(s<=l && r<=d)
 {
  return A[node];
 }
  else
  {
   int m=(l+r)/2,sl=0,sr=0;
   if(s<=m) sl=query(l,m,2*node);
   if(m+1<=d) sr=query(m+1,r,2*node+1);
   return sl+sr;
  }
}

int main()
{
    f>>n>>m;
    for(int i=1;i<=n;i++)
      f>>v[i];
    build(1,n,1);
    for(int i=1;i<=m;i++)
    {
     int c,x,y;
     f>>c>>x>>y;
     if(c==1)
     {
      s=x,d=y;
      g<<query(1,n,1)<<"\n";
     }
     else
     {
      v[x]-=y;
      poz=x;
      update(1,n,1);
     }
    }
    return 0;
}