105852024-04-05 23:31:49999Branch Cuttingcpp17Elfogadva 100/100388ms11888 KiB
// Source: https://usaco.guide/general/io

#include <bits/stdc++.h>
using namespace std;
#define endl ' '

int mod(int num, int m){
	if(num>=0)return num%m;
	else{
		return (num+m)%m;
	}
}

void bruteforce(int n, int q){
	vector<int> v(n);
	int mindex=0;
	for(int i = 0;i<n;i++){
			cin>>v[i];
	}
	for(int i = 0;i<=q;i++){
		if(i!=0){
			int a=0,b=0;	
			cin>>a>>b;
			v[a]=b;
		}
		for(int i = 0;i<n;i++){
			if(v[i]<v[mindex]||(v[i]==v[mindex]&&(i==n-1&&v[0]!=v[mindex]||v[i]!=v[i+1]))){
				mindex=i;
			}
		}
		int ans=0;
		int j=(mindex+1)%n;
		while(j!=mindex){
			if(j==(mindex+1)%n&&ans>0)break;
			if(v[mod(j-1,n)]<v[j]){
				ans++;
				j++;
			}
			j++;
			j%=n;
		}
		cout<<ans<<' ';
	}
}


int n;

bool check(int x, int l, int r) {
    // Check if x lies within the CIRCULAR interval [l, r]
    if (r >= l)
        return x >= l && x <= r;
    else
        return x >= l || x <= r;
}

int getS(int l, int r) {
    // Normalize l and r to be within the range of the array
    l = (l + n) % n;
    r = (r + n) % n;

    // Calculate the size of the circular interval [l, r]
    if (r >= l)
        return r - l + 1;
    else
        return n - l + r + 1;
}

int cir(int x){
	if(x>=0)return x%n;
	else return x+n;
}

map<int,int> s;
int ans;

void ansu(int l,int r){
	if(l==r)return;
	ans+=getS(l,r)/2;
	s[l]=r;
}

void alga(int X){
	auto it=s.upper_bound(X);
	if(it==s.begin()){
		it=s.end();
	}
	it--;
	int l=(*it).first,r=(*it).second;
	if(check(X,l,r)){
		s.erase(l);
		ans-=getS(l,r)/2;
		if(getS(l,r)>2){
			if(l==X){
				ansu(cir(X+1),r);
			}
			else if(r==X){
				ansu(l,cir(X-1));
			}
			else{
				ansu(l,cir(X-1));
				ansu(cir(X+1),r);
			}
		}
	}
}

void belga(int X, int mode){
	if(s.empty()){
		if(mode==1)ansu(X,cir(X+1));
		if(mode==2)ansu(cir(X-1),X);
		if(mode==3)ansu(cir(X-1),cir(X+1));
		return;
	}
	auto it=s.upper_bound(X);
	if(mode==1){
		if(it==s.end())it=s.begin();
		int l=(*it).first,r=(*it).second;
		if(cir(X+1)==l){
			ans-=getS(l,r)/2;
			s.erase(it);
			ansu(X,r);
		}
		else{
			ansu(X,cir(X+1));
		}
	}
	if(mode==2){
		if(it==s.begin())it=s.end();
		it--;
		int l=(*it).first,r=(*it).second;
		if(cir(X-1)==r){
			ans-=getS(l,r)/2;
			s.erase(it);
			ansu(l,X);
		}
		else{
			ansu(cir(X-1),X);
		}
	}
	if(mode==3){
		if(it==s.end())it=s.begin();
		auto itt=it;
		if(it==s.begin())it=s.end();
		it--;
		int l2=(*itt).first,r2=(*itt).second;
		int l=(*it).first,r=(*it).second;
		if(cir(X-1)==r&&cir(X+1)==l2){
			ans-=getS(l,r)/2;
			ans-=getS(l2,r2)/2;
			s.erase(it);
			s.erase(itt);
			ansu(l,r2);
		}
		else if(cir(X-1)==r){
			ans-=getS(l,r)/2;
			s.erase(it);
			ansu(l,cir(X+1));
		}
		else if(cir(X+1)==l2){
			ans-=getS(l2,r2)/2;
			s.erase(itt);
			ansu(cir(X-1),r2);
		}
		else ansu(cir(X-1),cir(X+1));
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int q;cin>>n>>q;
	if(0)bruteforce(n,q);
	else{
		vector<int> v(n);
		for(int i = 0;i<n;i++){
			cin>>v[i];
		}
		for(int j = 0,i=min_element(v.begin(),v.end())-v.begin();j<n;j++,i=(i+1)%n){
			if(v[i]<v[cir(i+1)]){
				belga(cir(i+1),2);
			}
		}
		cout<<ans<<endl;
		for(int i = 0;i<q;i++){
			int a,b;cin>>a>>b;
			alga(a);
			v[a]=b;
			if(v[a]<v[cir(a+1)]&&v[a]>v[cir(a-1)])belga(a,3);
			else if(v[a]<v[cir(a+1)]) belga(a,1);
			else if(v[a]>v[cir(a-1)]) belga(a,2);
			cout<<ans<<endl;
			/*for(auto w:s){
				cout<<w.first<<' '<<w.second<<'\n';
			}cout<<'\n';*/
		}
	}
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1832 KiB
2Elfogadva3ms2032 KiB
subtask28/8
3Elfogadva3ms2244 KiB
4Elfogadva3ms2472 KiB
5Elfogadva3ms2556 KiB
6Elfogadva3ms2788 KiB
7Elfogadva3ms2864 KiB
8Elfogadva3ms2976 KiB
9Elfogadva3ms3208 KiB
10Elfogadva3ms3448 KiB
11Elfogadva3ms3652 KiB
subtask315/15
12Elfogadva216ms8896 KiB
13Elfogadva208ms8592 KiB
14Elfogadva200ms7900 KiB
15Elfogadva218ms9488 KiB
16Elfogadva216ms9900 KiB
17Elfogadva123ms5164 KiB
18Elfogadva120ms5268 KiB
subtask410/10
19Elfogadva3ms4160 KiB
20Elfogadva3ms4012 KiB
21Elfogadva4ms4028 KiB
22Elfogadva4ms3988 KiB
23Elfogadva4ms3988 KiB
24Elfogadva4ms4124 KiB
25Elfogadva4ms4044 KiB
26Elfogadva4ms4088 KiB
subtask525/25
27Elfogadva4ms4164 KiB
28Elfogadva3ms4160 KiB
29Elfogadva14ms4560 KiB
30Elfogadva14ms4596 KiB
31Elfogadva14ms4600 KiB
32Elfogadva12ms4524 KiB
33Elfogadva13ms4440 KiB
34Elfogadva14ms4696 KiB
subtask642/42
35Elfogadva54ms5700 KiB
36Elfogadva21ms5668 KiB
37Elfogadva388ms10084 KiB
38Elfogadva388ms8456 KiB
39Elfogadva381ms11140 KiB
40Elfogadva270ms6056 KiB
41Elfogadva266ms6016 KiB
42Elfogadva268ms6036 KiB
43Elfogadva361ms11888 KiB