Cod sursa(job #2181651)

Utilizator PinkiePie1189Preoteasa Mircea-Costin PinkiePie1189 Data 21 martie 2018 19:41:38
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include<stdio.h>
#define MAXN 15001
#define DIM 100000
FILE*fin,*fout;
int arbint[4*MAXN];
char buf[DIM];
int pos=0;
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);
inline void citire(int& n);
int main()
{
    fin=fopen("datorii.in","r");
    fout=fopen("datorii.out","w");
    int N,M;
    citire(N);
    citire(M);
    for(int i=1; i<=N; i++)
    {
        int x;
        citire(x);
        update(1,1,N,i,-x);
    }
    for(int i=1; i<=M; i++)
    {
        int type;
        int st,dr;
        citire(type);
        citire(st);
        citire(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);
}
inline void citire(int &n)
{
    n=0;
    while(buf[pos]<'0' || buf[pos]>'9')
    {
        pos++;
        if(pos==DIM)
        {
            fread(buf,1,DIM,fin);
            pos=0;
        }
    }
    while(buf[pos]>='0' && buf[pos]<='9')
    {
        n=n*10+buf[pos]-'0';
        pos++;
        if(pos==DIM)
        {
            fread(buf,1,DIM,fin);
            pos=0;
        }
    }
}