Cod sursa(job #2405474)

Utilizator andreighinea1Ghinea Andrei-Robert andreighinea1 Data 14 aprilie 2019 15:41:44
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <fstream>

using namespace std;

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

int i,n,m,q,a,b,poz,x;
int arb[32768];

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

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

    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=0,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);
        poz=i;
        gen(1,1,n,false);
    }
    for(i=1;i<=m;++i){
        fscanf(f,"%d%d%d",&q,&a,&b);
        if(q==0){ // achit
            poz=a;
            x=b;
            gen(1,1,n,true);
        }
        else // interogare
            g << interogare(1,1,n) << '\n';//fprintf(g,"%d\n",interogare(1,1,n));
    }
    return 0;
}