Cod sursa(job #1437940)

Utilizator teoceltareconstantin teodor teoceltare Data 18 mai 2015 20:57:11
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int n,m,v[15010];
long long tot;
int x,y,z;
struct nod
{
    int suma,lst,ldr;
    nod *st,*dr;
} *dat;
void citire()
{
    fin>>n>>m;
    for(int a1=1;a1<=n;a1++)
    {
        fin>>v[a1];
    }
}
void prel(nod *&c, int str, int drr)
{
    if(str==drr)
    {
        c->suma=v[str];
        c->st=0;
        c->dr=0;
    }
    else
    {
        int mij;
        nod *c1,*c2;
        c1=new(nod);
        c2=new(nod);
        mij=(str+drr)/2;
        prel(c1,str,mij);
        c->st=c1;
        prel(c2,mij+1,drr);
        c->dr=c2;
        c->suma=c1->suma+c2->suma;
        c->lst=str;
        c->ldr=drr;
    }

}
void scad1(nod *c)
{
    int mij;
    c->suma-=y;
    mij=(c->lst+c->ldr)/2;
    if(x<=mij and c->st!=0)
    {
        scad1(c->st);
    }
    else if(c->st!=0)
    {
        scad1(c->dr);
    }
}
void afis1(nod *c)
{
    if(c->lst>=x and c->ldr<=y)
    {
        tot+=c->suma;
    }
    else
    {
        int mij;
        mij=(c->lst+c->ldr)/2;
        if(x<=mij and c->st!=0)
        {
            afis1(c->st);
        }
        if(y>mij and c->dr!=0)
        {
            afis1(c->dr);
        }
    }
}
int main()
{
    int mij;
    citire();
    dat=new(nod);
    prel(dat,1,n);
    for(int a1=1;a1<=m;a1++)
    {
        fin>>z;
        if(z==0)
        {
            fin>>x>>y;
            scad1(dat);
        }
        if(z==1)
        {
            tot=0;
            fin>>x>>y;
            if(y<x) switch(x,y);
            afis1(dat);
            fout<<tot<<'\n';
        }
    }
}