Submission #1147352

#TimeUsernameProblemLanguageResultExecution timeMemory
1147352LuvidiRMQ (NOI17_rmq)C++20
100 / 100
42 ms15040 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pll pair<ll, ll> #define pii pair<int, int> #define fs first #define sc second #define pb push_back void solve() { int n,q; cin>>n>>q; vector<pii> seg[n]; while(q--){ int l,r,x; cin>>l>>r>>x; seg[l].pb({r,x}); } int a[n]; priority_queue<pii> pq; for(int i=0;i<n;i++){ for(auto[r,x]:seg[i]){ pq.push({x,r}); } while(!pq.empty()&&pq.top().sc<i)pq.pop(); if(pq.empty())a[i]=-1; else a[i]=pq.top().fs; } auto imp=[&]{ while(n--)cout<<"-1 "; cout<<'\n'; exit(0); }; vector<int> idx[n]; for(int i=0;i<n;i++){ if(a[i]>=0)idx[a[i]].pb(i); } memset(a,-1,sizeof(a)); pii rg[n]; for(int i=0;i<n;i++)rg[i]={0,n-1}; for(int i=0;i<n;i++){ for(auto[r,x]:seg[i]){ rg[x].fs=max(rg[x].fs,i); rg[x].sc=min(rg[x].sc,r); } } bool vis[n]; memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++){ for(int j:idx[i]){ if(rg[i].fs<=j&&j<=rg[i].sc){ a[j]=i; vis[i]=1; break; } } } int v=0; for(int i=0;i<n;i++){ v=max(v,i); for(int j:idx[i])if(a[j]==-1){ while(v<n&&vis[v])v++; if(v==n)imp(); vis[v]=1; a[j]=v; } } v=0; for(int i=0;i<n;i++)if(a[i]==-1){ while(vis[v])v++; a[i]=v; vis[v]=1; } int sp[n][20]; for(int i=0;i<n;i++)sp[i][0]=a[i]; for(int x=1;x<20;x++){ for(int i=0;i+(1<<x)<=n;i++)sp[i][x]=min(sp[i][x-1],sp[i+(1<<x-1)][x-1]); } for(int i=0;i<n;i++){ for(auto[r,x]:seg[i]){ int k=31-__builtin_clz(r-i+1); if(min(sp[i][k],sp[r-(1<<k)+1][k])!=x){ imp(); } } } for(int i=0;i<n;i++)cout<<a[i]<<' '; cout<<'\n'; } int main() { #ifdef FPO freopen("in","r",stdin); freopen("out","w",stdout); #endif ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...