Cod sursa(job #1939561)

Utilizator PinkiePie1189Preoteasa Mircea-Costin PinkiePie1189 Data 25 martie 2017 20:13:34
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include<stdio.h>
#define MAXN 15001
FILE*fin,*fout;
int arbint[4*MAXN];
inline int left_son(int nod);
inline int right_son(int nod);
void update(int nod,int st,int dr,int poz,int val);
int query(int nod,int st,int dr,int queryst,int querydr);
int main()
{
    fin=fopen("datorii.in","r");
    fout=fopen("datorii.out","w");
    int N,M;
    fscanf(fin,"%d%d",&N,&M);
    for(int i=1;i<=N;i++)
    {
        int x;
        fscanf(fin,"%d",&x);
        update(1,1,N,i,-x);
    }
    for(int i=1;i<=M;i++)
    {
        int type;
        int st,dr;
        fscanf(fin,"%d%d%d",&type,&st,&dr);
        if(type==0)
        {
            update(1,1,N,st,dr);
        }
        if(type==1)
        {
            fprintf(fout,"%d\n",query(1,1,N,st,dr));
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}
inline int left_son(int nod)
{
    return 2*nod;
}
inline int right_son(int nod)
{
    return 2*nod+1;
}
void update(int nod,int st,int dr,int poz,int val)
{
    if(st==dr)
    {
        arbint[nod]-=val;
        return;
    }
    int mij=(st+dr)>>1;
    if(poz<=mij)
    {
        update(left_son(nod),st,mij,poz,val);
    }
    else
    {
        update(right_son(nod),mij+1,dr,poz,val);
    }
    arbint[nod]=arbint[left_son(nod)]+arbint[right_son(nod)];
}
int query(int nod,int st,int dr,int queryst,int querydr)
{
    if(queryst<=st && dr<=querydr)
    {
        return arbint[nod];
    }
    if(queryst>dr || querydr<st)
    {
        return 0;
    }
    int mij=(st+dr)>>1;
    return query(left_son(nod),st,mij,queryst,querydr)+query(right_son(nod),mij+1,dr,queryst,querydr);
}