| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 19162 | Namnamseo | Evaluation (kriii1_E) | C++14 | 775 ms | 9116 KiB | 
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>
using namespace std;
const int M=int(1e9)+7;
typedef long long ll;
struct seg_struct {
    static const int S=131072;
    int len [2*S];
    int sqrt[2*S]; // square tree
    int sumt[2*S]; // sum tree
    int lazy[2*S];
    int& top=sqrt[1];
    void upd(int pos,int val){
        ll newsqr = sqrt[pos];
        //printf("before sqrt %d\n",sqrt[pos]);
        newsqr += 2LL * sumt[pos] * val%M; newsqr %= M;
        //printf("delta1 %d\n",int(newsqr));
        newsqr += ((long long)val)*val%M*len[pos]%M; newsqr %= M;
        //printf("len %d, so squares %d\n",len[pos],int(newsqr));
        sqrt[pos]=newsqr;
        sumt[pos]=(sumt[pos]+len[pos]*1LL*val%M)%M;
        lazy[pos]=(lazy[pos]+val)%M;
        //printf("Updating %d; value %d\n",pos,int(newsqr));
    }
    void pd(int pos,int myl,int myr){
        if(pos >= S || lazy[pos]==0) return;
        upd(pos*2,lazy[pos]);
        upd(pos*2+1,lazy[pos]);
        lazy[pos]=0;
    }
    void update(int l,int r,int val,int pos=1,int myl=0,int myr=S-1){
        pd(pos,myl,myr);
        if(r<myl || myr<l) return;
        else if(l<=myl && myr<=r){
            upd(pos,val);
        } else {
            int mid=(myl+myr)/2;
            update(l,r,val,pos*2  ,myl  ,mid);
            update(l,r,val,pos*2+1,mid+1,myr);
            sqrt[pos] = (sqrt[pos*2]+sqrt[pos*2+1])%M;
            sumt[pos] = (sumt[pos*2]+sumt[pos*2+1])%M;
        }
    }
} seg;
struct updquery {
    int l,r;
    int pos;
    int value;
} query [200010];
int ycomp [200010];
int n;
void read(int& a){ scanf("%d",&a); }
void read(long long& a){ scanf("%I64d",&a); }
void read(char*& a){ scanf("%s",a); }
template<typename T,typename... Args> void read(T& a,Args&... args){ read(a); read(args...); }
int main()
{
    int i,a,b,c,d,v;
    read(n);
    for(i=0;i<n;++i){
        read(a,c,b,d,v);
        //printf("range %d~%d, pos %d~%d\n",a,b,c,d);
        ycomp[i*2]   = a;
        ycomp[i*2+1] = b+1;
        query[i*2]   = {a,b+1,  c, v};
        query[i*2+1] = {a,b+1,d+1,M-v};
    }
    sort(query, query+2*n, [](const updquery& a,const updquery& b){ return a.pos < b.pos; });
    sort(ycomp, ycomp+2*n);
    int ynn = unique(ycomp, ycomp+2*n)-ycomp;
    for(i=0;i+1<ynn;++i){
        seg.len[seg.S+i]=ycomp[i+1]-ycomp[i];
    }
    for(i=seg.S-1;1<=i;--i) seg.len[i]=seg.len[i*2]+seg.len[i*2+1];
    int ans = 0;
    for(i=0;i<2*n;++i){
        auto& cq=query[i];
        if(i) ans = (ans + (cq.pos-query[i-1].pos)*1LL*seg.top%M)%M;
        int l=lower_bound(ycomp, ycomp+ynn, cq.l)-ycomp;
        int r=lower_bound(ycomp, ycomp+ynn, cq.r)-ycomp;
        //printf("Update %d~%d %d~%d pos %d v %d\n",l,r-1,cq.l,cq.r,cq.pos,cq.value);
        seg.update(l, r-1, cq.value);
        //printf("pos %d, top %d\n",cq.pos,seg.top);
        //putchar(10);
    }
    printf("%d\n",ans);
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
