제출 #1343034

#제출 시각아이디문제언어결과실행 시간메모리
1343034SzilDeda (COCI17_deda)C++20
140 / 140
602 ms7780 KiB
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
using ll = long long; const ll inf = LONG_LONG_MAX;
vector<ll> segtree;
void update(ll pos, ll l, ll r, ll to, ll val){
	if(l==r){
		segtree[pos]=val;
		return;
	}
	ll mid=(l+r)/2;
	if(to<=mid) update(2*pos+1, l, mid, to, val);
	else update(2*pos+2, mid+1, r, to, val);
	segtree[pos]=min(segtree[2*pos+1], segtree[2*pos+2]);
}
ll query(ll pos, ll l, ll r, ll bal, ll jobb){
	if(l>=bal&&r<=jobb){
		return segtree[pos];
	}
	ll mid=(l+r)/2, res=inf;
	// Ha jovobeli Linh olvassa ezt, emlekezzen a regi Linh majdnem tokeletessegere.
	if(mid>=bal) res=query(2*pos+1, l, mid, bal, jobb);
	if(mid<jobb) res=min(res, query(2*pos+2, mid+1, r, bal, jobb));
	return res;
}
int main() {
	ios::sync_with_stdio(0); cin.tie(0);
	int n, q; cin>>n>>q;
	segtree.resize(n*4, inf);
	while(q--){
		char a; int b, c; cin>>a>>b>>c;
		if(a=='M'){
			update(0, 1, n, c, b);
		}
		else{
			swap(b, c); int l=b, r=n;
			while(l<r){
				ll mid=(l+r)/2;
				//cerr<<c<<" "<<l<<" "<<r<<" "<<query(0, 1, n, l, mid)<<endl;
				if(query(0, 1, n, l, mid)<=c) r=mid;
				else l=mid+1;
			}
			//cerr<<l<<" "<<r<<endl;
			//cerr<<endl;
			ll p=query(0, 1, n, l, l);
			//cerr<<c<<" "<<query(0, 1, n, l, l)<<" "<<l<<endl;
			if(p>c) cout<<-1<<"\n";
			else cout<<l<<"\n";
		}
	}
	
}
#Verdict Execution timeMemoryGrader output
Fetching results...