Cod sursa(job #2592389)

Utilizator mariamirabella2Bucur-Sabau Maria-Mirabela mariamirabella2 Data 1 aprilie 2020 17:26:48
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <cstdio>

using namespace std;


int v[15005],n,t,nr,st,dr,k,rasp;
int aint[100005];

const int Lim = 19000000;
int u =  Lim - 1;
char buf[Lim];

void Next () {
    if (++u == Lim)
        std::fread(buf, 1, Lim, stdin), u = 0;
}

void Get (int &x) {
    x = 0;
    for (; buf[u] < '0' || buf[u] > '9'; Next());
    for (x = 0; buf[u] >= '0' && buf[u] <= '9'; Next())
           x = x * 10 + buf[u] - '0';

}

void query(int nod,int l,int r, int st,int dr){
    if(st<=l && dr>=r){
        rasp+=aint[nod];
        return;
    }
    int mij=(l+r)>>1;
    if(st<=mij){
        query(nod*2,l,mij,st,dr);
    }
    if(dr>mij){
        query(nod*2+1,mij+1,r,st,dr);
    }
}

void update(int nod,int l,int r,int poz,int val){
    if(l==poz && r==poz){
        aint[nod]-=val;
        return;
    }
    int mij;
    mij=(l+r)>>1;
    if(poz<=mij){
        update(nod*2,l,mij,poz,val);
    }
    if(poz>mij){
        update(nod*2+1,mij+1,r,poz,val);
    }
    aint[nod]=aint[nod*2+1]+aint[nod*2];
}
void update1(int nod,int l,int r,int poz,int val){
    if(l==poz && r==poz){
        aint[nod]=val;
        return;
    }
    int mij;
    mij=(l+r)>>1;
    if(poz<=mij){
        update1(nod*2,l,mij,poz,val);
    }
    if(poz>mij){
        update1(nod*2+1,mij+1,r,poz,val);
    }
    aint[nod]=aint[nod*2+1]+aint[nod*2];
}



int main()
{
    freopen("datorii.in","r",stdin);
	freopen("datorii.out","w",stdout);
    Get(n);Get(t);
    for(int i=1;i<=n;i++){
        Get(v[i]);
        update1(1,1,n,i,v[i]);
    }
    while(t--){
        Get(nr);Get(st);Get(dr);
        if(nr==1){
            rasp=0;
            query(1,1,n,st,dr);
            printf("%d \n",rasp);
        }
        else{
            v[st]-=dr;
            update(1,1,n,st,dr);
        }
    }
    return 0;
}