Submission #1273809

#TimeUsernameProblemLanguageResultExecution timeMemory
1273809Petrix말 (IOI15_horses)C++20
0 / 100
1593 ms36868 KiB
#include "horses.h"
#include<iostream>
using namespace std;

#pragma GCC optimize("O3,inline")
#define MOD 1000000007

int n;
long long x[600001];
long long aint[2400001];
long long y[600001];


/// Y

struct aint_y{
    long long a,poz;
} ainty[2400001];

aint_y combin(aint_y a,aint_y b){
    if(a.a>b.a) return a;
    return b;
}

void init_aint_y(int nod,int st,int dr){
    if(st==dr){
        ainty[nod]={y[st],st};
        return;
    }
    int mij=(st+dr)/2;
    init_aint_y(2*nod,st,mij);
    init_aint_y(2*nod+1,mij+1,dr);
    ainty[nod]=combin(ainty[2*nod],ainty[2*nod+1]);
}

void update_y(int nod,int st,int dr,int a){
    if(st==dr){
        ainty[nod]={y[st],st};
        return;
    }
    int mij=(st+dr)/2;
    if(a<=mij) update_y(2*nod,st,mij,a);
    else update_y(2*nod+1,mij+1,dr,a);
    ainty[nod]=combin(ainty[2*nod],ainty[2*nod+1]);
}

aint_y query_y(int nod,int st,int dr,int a,int b){
    if(b<st || dr<a) return {(long long)-1e9,0};
    if(a<=st && dr<=b) return ainty[nod];
    int mij=(st+dr)/2;
    return combin(query_y(2*nod,st,mij,a,b),query_y(2*nod+1,mij+1,dr,a,b));
}

/// X
void init_aint(int nod,int st,int dr){
    if(st==dr){
        aint[nod]=x[st];
        return;
    }
    int mij=(st+dr)/2;
    init_aint(2*nod,st,mij);
    init_aint(2*nod+1,mij+1,dr);
    aint[nod]=aint[2*nod]*aint[2*nod+1]%MOD;
}

void update(int nod,int st,int dr,int a){
    if(st==dr){
        aint[nod]=x[st];
        return;
    }
    int mij=(st+dr)/2;
    if(a<=mij) update(2*nod,st,mij,a);
    else update(2*nod+1,mij+1,dr,a);
    aint[nod]=aint[2*nod]*aint[2*nod+1]%MOD;
}

long long query(int nod,int st,int dr,int a,int b){
    if(b<st || dr<a) return 1;
    if(a<=st && dr<=b) return aint[nod];
    int mij=(st+dr)/2;
    return query(2*nod,st,mij,a,b)*query(2*nod+1,mij+1,dr,a,b)%MOD;
}


int find_next(int poz){
    int dr=poz-1,st=1,rasp=0,mij;
    while(st<=dr){
        mij=(st+dr)/2;
        if(query(1,1,n,mij,n)!=query(1,1,n,poz,n)){
            st=mij+1;rasp=mij;
        }else dr=mij-1;
    }
    return rasp;
}

int calc(){
    long long ci,prod,i,rasp=1,max1;
    ci=n;prod=-1;
    for(i=n;i>0;i=find_next(i)){
        if(prod>1e9) break;
        auto it=query_y(1,1,n,find_next(i)+1,i);
        if(it.a>prod){
            ci=it.poz;prod=it.a;
        }
        prod*=x[i];
    }
    rasp=query(1,1,n,1,ci);
    rasp=(rasp*y[ci])%MOD;
	return rasp;
}

int init(int N,int X[],int Y[]){
    int i;
    n=N;
    for(i=1;i<=n;i++){
        x[i]=X[i-1];
        y[i]=Y[i-1];
    }
    init_aint(1,1,n);
    init_aint_y(1,1,n);
    return calc();
}

int updateX(int pos,int val){
    x[pos+1]=val;
    update(1,1,n,pos+1);
	return calc();
}

int updateY(int pos,int val){
    y[pos+1]=val;
    update_y(1,1,n,pos+1);
	return calc();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...