Cod sursa(job #3133976)

Utilizator infomatic2Liviu Firca infomatic2 Data 27 mai 2023 19:40:28
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>
#include<limits.h>
#include<algorithm>

using namespace std;

ifstream in("datorii.in");
ofstream out("datorii.out");

int suma(int * a, int st, int dr, int L, int R,int index){
    if (st>=L&&dr<=R){
        return a[index];
    }
    else if (dr<L||st>R){
        return 0;// nu ma pot duce in acest interval
    }
    else{
        int mid=(st+dr)/2;
        return suma(a,st,mid,L,R,2*index)+suma(a,mid+1,dr,L,R,2*index+1);
    }
}

int initializeaza(int * arbore,int index,int lelft,int right, int * a){
    if(lelft==right){
        return arbore[index]=a[lelft];

    }
    else 
    {
        int mid =(lelft+right)/2;
        int value=initializeaza(arbore,2*index,lelft,mid,a)+initializeaza(arbore,2*index+1,mid+1,right,a);
        return arbore[index]=value;
    }
}

void modifica(int * arbore,int index,int value,int L,int R,int pozitie){
    if(pozitie<=R&&pozitie>=L){
        
        if(L!=R){
            int mid=(L+R)/2;
            modifica(arbore,2*index,value,L,mid,pozitie);
            modifica(arbore,2*index+1,value,mid+1,R,pozitie);
            arbore[index]-=value;
        }
        else{
            arbore[index]-=value;
        }
    }
    
}

int main(){

int n,m,temp,x,y;
in>>n>>m;
int* arb=new int[n];
for (int i=0;i<n;i++){
    in>>arb[i];
}
int * arbore=new int[4*n];
initializeaza(arbore,1,0,n-1,arb);

for( int i=0;i<m;i++){
    in>>temp;
    switch(temp){
        case 1:
        {
            in>>x>>y;
            out<<suma(arbore,0,n-1,x-1,y-1,1)<<'\n';
        }
        break;
        case 0:
        {
            in>>x>>y;
            
            modifica(arbore,1,y,0,n-1,x-1);
            
        }
        break;
    
    }
}
}