Cod sursa(job #1728062)

Utilizator RaduHHarhoi Radu RaduH Data 12 iulie 2016 10:30:59
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <fstream>
#define N 15010
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int n,m,i,j,q,v[4*N],x,sum;
void update(int nod, int st, int dr, int val, int poz){
    int mij=(st+dr)/2;
    if(st==dr)
    {
        v[nod]=val;
        return;
    }
    if(poz<=mij) update(2*nod,st,mij,val,poz);
    else update(2*nod+1,mij+1,dr,val,poz);
    v[nod]=v[2*nod]+v[2*nod+1];
}
void query(int nod, int st, int dr, int start, int stop){
    int mij=(st+dr)/2;
    if(start<=st && dr<=stop)
    {
        sum+=v[nod];
        return;
    }
    if(start<=mij) query(2*nod,st,mij,start,stop);
    if(stop>mij) query(2*nod+1,mij+1,dr,start,stop);
}
void update2(int nod, int st, int dr, int val, int poz){
    int mij=(st+dr)/2;
    if(st==dr)
    {
        v[nod]-=val;
        return;
    }
    if(poz<=mij) update2(nod*2,st,mij,val,poz);
    else update2(nod*2+1,mij+1,dr,val,poz);
    v[nod]=v[nod*2]+v[nod*2+1];
}
int main(){
    fin>>n>>m;
    for(i=1;i<=n;i++)
    {
        fin>>x;
        update(1,1,n,x,i);
    }
    /*for(int k=1;k<=2*n;k++)
        fout<<v[k]<<" ";
    fout<<'\n';*/
    for(;m;m--)
    {
        fin>>q>>i>>j;
        if(q==0)
        {
            update2(1,1,n,j,i);
            /*for(int k=1;k<=2*n;k++)
                fout<<v[k]<<" ";
            fout<<'\n';*/
        }
        else
        {
            sum=0;
            query(1,1,n,i,j);
            fout<<sum<<'\n';
        }
    }
    fin.close();
    fout.close();
    return 0;
}