This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<cstdio>
#include<algorithm>
#include<map>
#define base 8192
#define MAX_N 5001
using namespace std;
pair<int,int> su;
map<int,int> wichi;
int n,m,k,head;
int sum=0;
int idxtree[base*2]={0};
class badak{
public:
    int from,to,deep;
}info[MAX_N];
class TR{
public:
    int parent,child[2],value;
}tree[MAX_N];
int fndmax(int ss,int ee){
    ss+=base;
    ee+=base;
    bool first=true;
    int res=-1;
    while(1){
        if(ss%2){
            if(first){
                res=idxtree[ss];
                first=false;
            }else{
                if(info[res].deep>info[idxtree[ss]].deep){
                    res=idxtree[ss];
                }
            }
            ss++;
        }
        if(ee%2==0){
            if(first){
                res=idxtree[ee];
                first=false;
            }else{
                if(info[res].deep>info[idxtree[ee]].deep){
                    res=idxtree[ss];
                }
            }
            ee--;
        }
        if(ss>ee) break;
        ss/=2;ee/=2;
    }
    return res;
}
void doidx(int ss,int ee){
    int i;
    while(1){
        if(ss%2){
            idxtree[ss/2]=idxtree[ss];
            ss++;
        }
        if(ee%2==0){
            idxtree[ee/2]=idxtree[ee];
            ee--;
        }
        if(ss>ee) break;
        for(i=ss;i<=ee;i+=2){
            if(info[idxtree[i]].deep<info[idxtree[i+1]].deep){
                idxtree[i/2]=idxtree[i];
            }else{
                idxtree[i/2]=idxtree[i+1];
            }
        }
        ss/=2;ee/=2;
    }
}
void mktree(int parent,int ss,int ee){
    int willhead;
    if(ss>ee) return;
    willhead=fndmax(ss,ee);
    if(parent>=0){
        tree[parent].child[(parent<ss)]=willhead;
        tree[willhead].value=(info[willhead].deep-info[parent].deep)*(info[ee].to-info[ss].from);
    }else{
        head=willhead;
        tree[willhead].value=(info[ee].to-info[ss].from)*info[willhead].deep;
    }
    tree[willhead].parent=parent;
    tree[willhead].child[0]=-1;
    tree[willhead].child[1]=-1;
    mktree(willhead,ss,willhead-1);
    mktree(willhead,willhead+1,ee);
}
int main(){
    int i,ii,ia,ib,ic,id;
    int cnt=0;
    scanf("%d",&n);
    m=(n-2)/2;
    scanf("%d %d",&ia,&ib);
    for(i=0;i<m;i++){
        scanf("%d %d",&ia,&ib);
        scanf("%d %d",&ic,&id);
        info[i].from=ia;
        info[i].to=ic;
        info[i].deep=ib;
        wichi[ia]=i;
        idxtree[base+i]=i;
    }
    scanf("%d %d",&ia,&ib);
    doidx(base,base+m-1);
    mktree(-1,0,m-1);
    for(i=0;i<m;i++){
        sum+=tree[i].value;
    }
    scanf("%d",&k);
    for(i=0;i<k;i++){
        scanf("%d %d %d %d",&ia,&ib,&ic,&id);
        ii=wichi[ia];
        while(ii>-1){
            sum-=tree[ii].value;
            tree[ii].value=0;
            ii=tree[ii].parent;
        }
    }
    printf("%d",sum);
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |