Cod sursa(job #2405443)

Utilizator andreighinea1Ghinea Andrei-Robert andreighinea1 Data 14 aprilie 2019 15:17:47
Problema Datorii Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
//#include <iostream>
#include <fstream>
#define nmax 15001

using namespace std;

FILE *f=fopen("datorii.in","rt");
FILE *g=fopen("datorii.out","wt");

int i,n,m,q,a,b,poz,x;
int v[nmax],arb[1<<15];

void gen(int nod,int st,int dr){
    if(dr<=poz&&poz<=st){ // am ajuns la intervalul element
        arb[nod]=x;
        return;
    }

    int m=(st+dr)>>1;
    if(poz<=m) gen(nod<<1,st,m);
    else       gen((nod<<1)+1,m+1,dr);

    arb[nod]=arb[nod<<1]+arb[(nod<<1)+1];
}

int interogare(int nod,int st,int dr){
    if(st>=a && dr<=b) return arb[nod];

    int x1,x2;
    x1=x2=0;

    int m=(st+dr)>>1;
    if(a<=m) x1=interogare(nod<<1,st,m);
    if(b>m)  x2=interogare((nod<<1)+1,m+1,dr);

    x1+=x2;
    return x1;
}

int main()
{
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=n;++i){
        fscanf(f,"%d",&x);
        v[i]=x;
        poz=i;
        gen(1,1,n);
    }
    for(i=1;i<=m;++i){
        fscanf(f,"%d%d%d",&q,&a,&b);
        if(q==0){ // achit
            poz=a;
            v[a]-=b;
            x=v[a];
            gen(1,1,n);
        }
        else{ // interogare
            fprintf(g,"%d\n",interogare(1,1,n));
        }
    }
    return 0;
}