Cod sursa(job #1534975)

Utilizator LegionHagiu Stefan Legion Data 24 noiembrie 2015 09:21:43
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <iostream>
#include <fstream>
using namespace std;
int arb[300000];
int x,total;
void adauga(int stanga,int dreapta,int loc,int val,int careelemnt)
{
    int mijloc;
    int maxim=-1;
    if (stanga==dreapta)
    {
        arb[loc]+=val;
        return;
    }
    else
    {
        mijloc=(stanga+dreapta)/2;
        if (careelemnt<=mijloc){adauga(stanga,mijloc,loc*2,val,careelemnt);}
        else{adauga(mijloc+1,dreapta,loc*2+1,val,careelemnt);}
        arb[loc]=arb[loc*2]+arb[loc*2+1];
    }
}
void scade(int stanga,int dreapta,int loc,int val,int careelemnt)
{
    int mijloc;
    int maxim=-1;
    if (stanga==dreapta&&stanga==careelemnt)
    {
        arb[loc]-=val;
        return;
    }
    else
    {
        mijloc=(stanga+dreapta)/2;
        if (careelemnt<=mijloc){scade(stanga,mijloc,loc*2,val,careelemnt);}
        else{scade(mijloc+1,dreapta,loc*2+1,val,careelemnt);}
        arb[loc]=arb[loc*2]+arb[loc*2+1];
    }
}
void daraspuns(int loc,int a,int b,int x,int y)
{
    int mijloc=(a+b)/2;
    int maxim=-9999999;
    if (a>=x&&b<=y)
    {
        total+= arb[loc];
    }
    else
    {
        if (x<=mijloc)
        {
            daraspuns(loc*2,a,mijloc,x,y);
        }
        if (y>mijloc)
        {
            daraspuns(loc*2+1,mijloc+1,b,x,y);
        }
    }
}
int main()
{
    ifstream in("datorii.in");
    ofstream out("datorii.out");
    int i,n,m,y,p;
    in>>n;
    in>>m;
    for (i=1;i<=n;i++)
    {
        in>>x;
        adauga(1,n,1,x,i);
    }
    for (i=1;i<=m;i++)
    {
        in>>p;
        if (p==0)
        {
            in>>y;
            in>>x;
            scade(1,n,1,x,y);
        }
        else
        {
            total=0;
            in>>x;
            in>>y;
            daraspuns(1,1,n,x,y);
            out<<total<<"\n";
        }
    }
}