제출 #1177516

#제출 시각아이디문제언어결과실행 시간메모리
11775168pete8Bitaro, who Leaps through Time (JOI19_timeleap)C++20
34 / 100
3103 ms427284 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define f first
#define s second
#define pii pair<int32_t,int32_t>
#define ppii pair<int,pii>
#define vi vector<int>
#define pb push_back
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define F(n) for(int i=0;i<n;i++)
#define lb lower_bound
#define ub upper_bound
#define fastio ios::sync_with_stdio(false);cin.tie(NULL);
#pragma GCC optimize ("03,unroll-lopps")
#define sz(x) (int)((x).size())
#define int long long
using namespace std;
const int mod=1e9+7,mxn=3e5,inf=1e9,minf=-1e9,lg=20,Mxn=1e6;
//#undef int
int n,k,m,d,q;
void setIO(string name){
	ios_base::sync_with_stdio(0); cin.tie(0);
	freopen((name+".in").c_str(),"r",stdin);
	freopen((name+".out").c_str(),"w",stdout);
}
int L[mxn+10],R[mxn+10];
int L2[mxn+10],R2[mxn+10];

pair<pii,int> go[mxn+10][lg+1][2];
pair<pii,int> go2[mxn+10][lg+1][2];

struct seg{
	int32_t mn[4*mxn+10];
	void init(){for(int i=0;i<=4*n;i++)mn[i]=inf;}
	void pull(int pos){mn[pos]=min(mn[pos<<1],mn[pos<<1|1]);}
	void update(int qpos,int x,int pos=1,int l=1,int r=n){
		if(l>qpos||r<qpos)return;
		if(l==r)return void(mn[pos]=x);
		int mid=(l+r)>>1;
		update(qpos,x,pos<<1,l,mid);
		update(qpos,x,pos<<1|1,mid+1,r);
		pull(pos);
	}
	int get_first(int ql,int qr,int x,int pos=1,int l=1,int r=n){
		//find first x>mn[pos]
		if(l>qr||r<ql)return n;
		if(mn[pos]>=x)return n;
		int mid=(l+r)>>1;
		if(ql<=l&&r<=qr){
			if(l==r){
				if(mn[pos]<x)return l;
				return n;
			}
		}
		int y=get_first(ql,qr,x,pos<<1,l,mid);
		if(y!=n)return y;
		return get_first(ql,qr,x,pos<<1|1,mid+1,r);
	}
}t,T;

struct seg2{
	int32_t mx[4*mxn+10];
	void init(){for(int i=0;i<=4*n;i++)mx[i]=minf;}
	void pull(int pos){mx[pos]=max(mx[pos<<1],mx[pos<<1|1]);}
	void update(int qpos,int x,int pos=1,int l=1,int r=n){
		if(l>qpos||r<qpos)return;
		if(l==r)return void(mx[pos]=x);
		int mid=(l+r)>>1;
		update(qpos,x,pos<<1,l,mid);
		update(qpos,x,pos<<1|1,mid+1,r);
		pull(pos);
	}
	int get_first(int ql,int qr,int x,int pos=1,int l=1,int r=n){
		//find first x<mx[pos]
		if(l>qr||r<ql)return n;
		if(mx[pos]<=x)return n;
		int mid=(l+r)>>1;
		if(ql<=l&&r<=qr){
			if(l==r){
				if(mx[pos]>x)return l;
				return n;
			}
		}
		int y=get_first(ql,qr,x,pos<<1,l,mid);
		if(y!=n)return y;
		return get_first(ql,qr,x,pos<<1|1,mid+1,r);
	}
}t2,T2;

void cal(){
	t.init();
	t2.init();
	for(int i=1;i<=n-1;i++){
		t.update(i,R[i]-i);
		t2.update(i,L[i]-i);
	}
	for(int i=0;i<=lg;i++)for(int j=0;j<2;j++)go[n][i][j]={{n,j},0};
	for(int i=1;i<=n-1;i++){
		int a,b;
		a=t.get_first(i,n,R[i]-i);
		b=t2.get_first(i,n,R[i]-i);
		if(a<b)go[i][0][1]={{a,1},R[i]+a-i-R[a]};
		else go[i][0][1]={{b,0},0};
		
		a=t.get_first(i,n,L[i]-i);
		b=t2.get_first(i,n,L[i]-i);

		if(a<b)go[i][0][0]={{a,1},L[i]+a-i-R[a]};
		else go[i][0][0]={{b,0},0};
	}
	for(int j=1;j<=lg;j++){
		for(int i=1;i<=n-1;i++){
			for(int k=0;k<2;k++){
				pair<pii,int>x=go[go[i][j-1][k].f.f][j-1][go[i][j-1][k].f.s];
				go[i][j][k].f=x.f;
				go[i][j][k].s=go[i][j-1][k].s+x.s;
			}
		}
	}
}

void cal2(){
	T.init();
	T2.init();
	for(int i=1;i<=n-1;i++){
		T.update(i,R2[i]-i);
		T2.update(i,L2[i]-i);
	}
	for(int i=0;i<=lg;i++)for(int j=0;j<2;j++)go2[n][i][j]={{n,j},0};
	for(int i=1;i<=n-1;i++){
		int a,b;
		a=T.get_first(i,n,R2[i]-i);
		b=T2.get_first(i,n,R2[i]-i);
		if(a<b)go2[i][0][1]={{a,1},R2[i]+a-i-R2[a]};
		else go2[i][0][1]={{b,0},0};
		
		a=T.get_first(i,n,L2[i]-i);
		b=T2.get_first(i,n,L2[i]-i);

		if(a<b)go2[i][0][0]={{a,1},L2[i]+a-i-R2[a]};
		else go2[i][0][0]={{b,0},0};
	}
	for(int j=1;j<=lg;j++){
		for(int i=1;i<=n-1;i++){
			for(int k=0;k<2;k++){
				pair<pii,int>x=go2[go2[i][j-1][k].f.f][j-1][go2[i][j-1][k].f.s];
				go2[i][j][k].f=x.f;
				go2[i][j][k].s=go2[i][j-1][k].s+x.s;
			}
		}
	}
}
int32_t main(){
	fastio
	cin>>n>>q;
	for(int i=1;i<=n-1;i++){
		cin>>L[i]>>R[i],R[i]--;
		L2[n-i]=L[i];
		R2[n-i]=R[i];
	}
	cal();
	cal2();
	while(q--){
		int ty;cin>>ty;
		if(ty==2){
			int a,b,c,d;cin>>a>>b>>c>>d;
			if(a<=c){
				int x=t.get_first(a,n,b-a);
				int y=t2.get_first(a,n,b-a);
				if(min(x,y)>=c)cout<<max(0LL,b+c-a-d)<<'\n';
				else{
					ll ans=0;
					pii cur;
					if(x<y)cur={x,1},ans+=(b+x-a-R[x]);
					else cur={y,0};
					for(int i=lg;i>=0;i--){
						if(go[cur.f][i][cur.s].f.f<c){
							ans+=(1LL)*go[cur.f][i][cur.s].s;
							cur=go[cur.f][i][cur.s].f;
						}
					}
					int g;
					if(cur.s==0)g=L[cur.f];
					else g=R[cur.f];
					g+=c-cur.f;
					ans+=(1LL)*max(0LL,g-d);
					cout<<ans<<'\n';
				}
			}
			else{
				a=n-a+1;
				c=n-c+1;
				int x=T.get_first(a,n,b-a);
				int y=T2.get_first(a,n,b-a);
				if(min(x,y)>=c)cout<<max(0LL,b+c-a-d)<<'\n';
				else{
					ll ans=0;
					pii cur;
					if(x<y)cur={x,1},ans+=(b+x-a-R2[x]);
					else cur={y,0};
					for(int i=lg;i>=0;i--){
						if(go2[cur.f][i][cur.s].f.f<c){
							ans+=(1LL)*go2[cur.f][i][cur.s].s;
							cur=go2[cur.f][i][cur.s].f;
						}
					}
					int g;
					if(cur.s==0)g=L2[cur.f];
					else g=R2[cur.f];
					g+=c-cur.f;
					ans+=(1LL)*max(0LL,g-d);
					cout<<ans<<'\n';
				}
			}
		}
		else{
			int a,b,c;cin>>a>>b>>c;
			L[a]=b;
			R[a]=c-1;
			L2[n-a]=L[a];
			R2[n-a]=R[a];
			cal();
			cal2();
		}
	}
}
/*
*/

컴파일 시 표준 에러 (stderr) 메시지

timeleap.cpp:16:40: warning: bad option '-funroll-lopps' to pragma 'optimize' [-Wpragmas]
   16 | #pragma GCC optimize ("03,unroll-lopps")
      |                                        ^
timeleap.cpp:23:23: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   23 | void setIO(string name){
      |                       ^
timeleap.cpp:36:19: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   36 |         void init(){for(int i=0;i<=4*n;i++)mn[i]=inf;}
      |                   ^
timeleap.cpp:37:26: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   37 |         void pull(int pos){mn[pos]=min(mn[pos<<1],mn[pos<<1|1]);}
      |                          ^
timeleap.cpp:38:61: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   38 |         void update(int qpos,int x,int pos=1,int l=1,int r=n){
      |                                                             ^
timeleap.cpp:46:68: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   46 |         int get_first(int ql,int qr,int x,int pos=1,int l=1,int r=n){
      |                                                                    ^
timeleap.cpp:65:19: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   65 |         void init(){for(int i=0;i<=4*n;i++)mx[i]=minf;}
      |                   ^
timeleap.cpp:66:26: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   66 |         void pull(int pos){mx[pos]=max(mx[pos<<1],mx[pos<<1|1]);}
      |                          ^
timeleap.cpp:67:61: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   67 |         void update(int qpos,int x,int pos=1,int l=1,int r=n){
      |                                                             ^
timeleap.cpp:75:68: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   75 |         int get_first(int ql,int qr,int x,int pos=1,int l=1,int r=n){
      |                                                                    ^
timeleap.cpp:92:10: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   92 | void cal(){
      |          ^
timeleap.cpp:124:11: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
  124 | void cal2(){
      |           ^
timeleap.cpp:155:14: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
  155 | int32_t main(){
      |              ^
timeleap.cpp: In function 'void setIO(std::string)':
timeleap.cpp:25:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   25 |         freopen((name+".in").c_str(),"r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
timeleap.cpp:26:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   26 |         freopen((name+".out").c_str(),"w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...