제출 #136189

#제출 시각아이디문제언어결과실행 시간메모리
136189FedericoSSimple game (IZhO17_game)C++14
100 / 100
884 ms15640 KiB
#include <ext/pb_ds/assoc_container.hpp>
#include <iostream>
#include <set>
using namespace std;
using namespace __gnu_pbds;
typedef pair<int,int> pii;
typedef tree<pii, null_type, less<pii>, rb_tree_tag, tree_order_statistics_node_update> pbds;

int N,M;
int H[100005];
int t,x,y;
pbds A,B;
int c;

void add(int i){
	if(i==-1 or i==N-1)
		return;

	int a=H[i];
	int b=H[i+1];
	if(a>b)
		swap(a,b);

	A.insert({a,c++});
	B.insert({b,c++});

}

void remove(int i){
	if(i==-1 or i==N-1)
		return;

	int a=H[i];
	int b=H[i+1];
	if(a>b)
		swap(a,b);

	A.erase(A.lower_bound({a,-1}));
	B.erase(B.lower_bound({b,-1}));

}

int query(int h){
	return A.order_of_key({h,-1})-B.order_of_key({h,-1});
}


void print(){
	cout<<"******\n";

	cout<<"A ";
	for(pii x:A)
		cout<<x.first<<","<<x.second<<" ";
	cout<<"\n";

	cout<<"B ";
	for(pii x:B)
		cout<<x.first<<","<<x.second<<" ";
	cout<<"\n";

	cout<<"******\n";
}


int main(){
	cin>>N>>M;
	for(int i=0;i<N;i++)
		cin>>H[i];

	for(int i=0;i<N-1;i++)
		add(i);

	while(M--){

		cin>>t;

		if(t==1){
			cin>>x>>y;
			x--;
			remove(x-1);
			remove(x);
			H[x]=y;
			add(x-1);
			add(x);
		}
		else{
			cin>>x;
			cout<<query(x)<<"\n";
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...