Cod sursa(job #1029139)

Utilizator LizzardStanbeca Theodor-Ionut Lizzard Data 15 noiembrie 2013 00:49:12
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <iostream>
#include <fstream>
using namespace std;

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

void op0(int ,int ,int ,int ,int);
int op1(int ,int ,int ,int ,int);
int build(int ,int ,int );
int n,m,v[500000];

int main()
{
    int i,a,b,c;
    fin>>n>>m;
    v[1]=build(1,n,1);

    for(i=1;i<=m;i++)
    {
        fin>>a>>b>>c;
        if(a==1)
            fout<<op1(1,n,1,b,c)<<"\n";
        else
            op0(1,n,1,b,c);
    }

    return 0;
}

int build(int li, int ls, int i)
{
    if(li==ls)
    {
        fin>>v[i];
        return v[i];
    }
    v[i]= build(li,(li+ls)/2,2*i)+build((li+ls)/2+1,ls,2*i+1);
    return v[i];
}

int op1(int li, int ls, int i, int ci, int cs)
{
    if(ci<=li && ls<=cs)
        return v[i];

    int mi=li,ms=ls;
    if(mi<ci)   mi=ci;
    if(ms>cs)   ms=cs;

    if(mi<=ms)
        return (op1(li,(li+ls)/2,2*i,ci,cs)+op1((li+ls)/2+1,ls,2*i+1,ci,cs));
    return 0;
}

void op0(int li, int ls, int i, int t, int add)
{
    if(li==ls && li==t)
    {
        v[i]-=add;
        return;
    }
    if(t<=(li+ls)/2)
    {
        v[i]-=add;
        op0(li,(li+ls)/2,2*i,t,add);
    }
    else
    {
        v[i]-=add;
        op0((li+ls)/2+1,ls,2*i+1,t,add);
    }
}