Cod sursa(job #2534977)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 31 ianuarie 2020 11:23:06
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("demolish.in");
ofstream fout("demolish.out");
struct arbore{int cost;int poz;int tag;} aib[1500010];
struct punct{int st;int dr;int cost;};
vector<punct> v[500010];
int m,n,f,dx,dy,i,a1,b1,a2,b2,c;
void push_tag(int nod)
{
    aib[nod*2].tag+=aib[nod].tag;
    aib[nod*2+1].tag+=aib[nod].tag;
    aib[nod*2].cost+=aib[nod].tag;
    aib[nod*2+1].cost+=aib[nod].tag;
    aib[nod].tag=0;
}
void update(int nod,int st,int dr,int x,int y,int cost)
{
    if(x<=st&&dr<=y)
    {
        aib[nod].tag+=cost,aib[nod].cost+=cost;
        return;
    }
    push_tag(nod);
    int mid=(st+dr)/2;
    if(mid>=x&&st<=y) update(nod*2,st,mid,x,y,cost);
    if(dr>=x&&mid+1<=y) update(nod*2+1,mid+1,dr,x,y,cost);
    if(aib[nod*2+1].cost<aib[nod*2].cost) aib[nod]=aib[nod*2+1];
    else aib[nod]=aib[nod*2];
}

void build(int nod,int st,int dr)
{
    if(st==dr){aib[nod].poz=st;return;}
    push_tag(nod);
    int mid=(st+dr)/2;
    build(nod*2,st,mid);
    build(nod*2+1,mid+1,dr);
    if(aib[nod*2+1].cost<aib[nod*2].cost) aib[nod]=aib[nod*2+1];
    else aib[nod]=aib[nod*2];
}

int main()
{
    fin>>m>>n>>f>>dx>>dy;
    build(1,0,m-dx);
    for(i=1;i<=f;i++)
    {
        fin>>a1>>b1>>a2>>b2>>c;
        v[b1+1].push_back({max(a1-dx+1,0),a2-1,c});
        v[b2+dy].push_back({max(a1-dx+1,0),a2-1,-c});
        fout<<max(a1-dx+1,0)<<" "<<b1+1<<" "<<a2-1<<" "<<b2+dy<<"\n";
    }
    fout<<"\n\n";
    fout<<n-dy<<" "<<m-dx<<"\n\n";
    for(i=0;i<=n;i++)
    {
        for(auto it:v[i]) update(1,0,m-dx,it.st,it.dr,it.cost);
        if(i>=dy)
        {
            fout<<aib[i].cost<<" "<<i<<" "<<aib[i].poz<<"\n";
        }
    }
    return 0;
}