Cod sursa(job #1895028)

Utilizator Garen456Paun Tudor Garen456 Data 27 februarie 2017 18:55:14
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <fstream>
#define nmax 15050
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int Narb,aint[4*nmax];
inline void change(int p,int x)
{ int t;
    p+=Narb-1;
    aint[p]-=x;

    while(p>0)
    {   if(p%2==1) p--;
        t=p/2;
        aint[t]=aint[p]+aint[p+1];
        p=t;
    }
}
inline int Query(int p,int x,int y,int st,int dr)
{
    if(x==st && y==dr) return aint[p];
    int mij=(st+dr)/2;
    if(y<=mij)
        return Query(2*p,x,y,st,mij);
    if(x>mij)
        return Query(2*p+1,x,y,mij+1,dr);

    return  Query(2*p,x,mij,st,mij) + Query (2*p+1,mij+1,y,mij+1,dr) ;
}

int main()
{  int n,i,q,op,x,y;
    fin>>n>>q;
    Narb=1;
    while(Narb<n) Narb*=2;
    for(i=1;i<=n;++i)
        fin>>aint[Narb+i-1];
    for(i=Narb-1;i>=1;i--)
      aint[i]=aint[i*2]+aint[i*2+1];

    for(i=1;i<=q;++i)
    { fin>>op>>x>>y;
        if(op==1)
           fout<<Query(1,x,y,1,Narb)<<"\n";
       else change(x,y);
    }

    return 0;
}