Cod sursa(job #2070823)

Utilizator vancea.catalincatalin vancea.catalin Data 19 noiembrie 2017 22:38:54
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include<iostream>
#include<fstream>
#define DN 60010
using namespace std;
fstream fin("datorii.in",ios::in),fout("datorii.out",ios::out);
int n,m,N,pow[DN],A[DN];

void putere()
{
    int i;
    pow[0]=1;
    for(i=1;i<DN;i++)
    {
        pow[i]=pow[i-1]*2;
        if(n<=pow[i])
        {
            N=pow[i]; // 2^i
            return ;
        }
    }
}
void build()
{
    int i;
    for(i=N-1;i>0;i--) A[i]=A[2*i]+A[2*i+1];
}
void update(int nod,int st,int dr,int a,int b)
{
    if(a<st || dr<a) return ;
    if(st==dr)
    {
        A[nod]-=b;
        return ;
    }
    int f1=nod*2,f2=nod*2+1,m=(st+dr)/2;
    update(f1,st,m,a,b);
    update(f2,m+1,dr,a,b);
    A[nod]=(A[f1]+A[f2]);
}
int querry(int nod,int st,int dr,int a,int b)
{
    if(b<st || dr<a) return 0;
    if(a<=st && dr<=b) return A[nod];
    int f1=nod*2,f2=nod*2+1,m=(st+dr)/2,aux1,aux2;
    aux1=querry(f1,st,m,a,b);
    aux2=querry(f2,m+1,dr,a,b);
    return (aux1+aux2);
}
int main()
{
    int a,b,i,op;
    fin>>n>>m;
    putere();
    for(i=1;i<=n;i++) fin>>A[N+i-1];
    build();
    for(i=1;i<=m;i++)
    {
        fin>>op>>a>>b;
        if(op==0)
        {
            update(1,1,N,a,b);
        }
        else
        {
            fout<<querry(1,1,N,a,b)<<"\n";
        }
    }
}