Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //============================================================================
- // Name : ACM
- // Author : Tarango Khan
- // Team : BRACU Byteheads
- //============================================================================
- #include <bits/stdc++.h>
- using namespace std;
- #define Size 150005
- #define st 0
- #define ed 1000000000
- struct vert{
- int color;
- int prop;
- };
- vert tree[Size*4];
- void build_tree(int cur,int Start,int End){
- if(Start == End){
- tree[cur].color = 1;
- tree[cur].prop = -1;
- return;
- }
- int left = cur*2;
- int right = left+1;
- int mid = (Start+End)/2;
- build_tree(left,Start,mid);
- build_tree(right,mid+1,End);
- tree[cur].color = 1;
- tree[cur].prop = -1;
- }
- void update_child(int cur,int left,int right){
- tree[left].color = tree[cur].prop;
- tree[right].color = tree[cur].prop;
- tree[left].prop = tree[cur].prop;
- tree[right].prop = tree[cur].prop;
- tree[cur].prop = -1;
- }
- void update_tree(int cur,int Start,int End,int u,int v,int value){
- if(End < u || Start > v) return;
- if(Start >= u && End <= v){
- tree[cur].color = value;
- tree[cur].prop = value;
- return;
- }
- int left = cur*2;
- int right = left+1;
- int mid = (Start+End)/2;
- if(tree[cur].prop != -1){
- update_child(cur,left,right);
- }
- update_tree(left,Start,mid,u,v,value);
- update_tree(right,mid+1,End,u,v,value);
- }
- int tree_query(int cur,int Start,int End,int u,int v){
- if(End < u || Start > v){
- return 0;
- }
- if(Start >= u && End <= v){
- return tree[cur].color;
- }
- int left = cur*2;
- int right = left+1;
- int mid = (Start+End)/2;
- if(tree[cur].prop != -1){
- update_child(cur,left,right);
- }
- int s1 = tree_query(left,Start,mid,u,v);
- int s2 = tree_query(right,mid+1,End,u,v);
- return (s1+s2);
- }
- int S[Size];
- int T[Size];
- char Q[Size][2];
- vector<int> Values;
- map<int,int> Map,name;
- int Range,qry,u,v,val,N,id;
- void data_compress(){
- sort(Values.begin(),Values.end());
- Map.clear();
- int SS = (int)Values.size();
- id = 0;
- for(int i = 0;i<SS;i++){
- Map[Values[i]] = ++id;
- name[id] = Values[i];
- }
- for(int i = 0;i<qry;i++){
- S[i] = Map[S[i]];
- T[i] = Map[T[i]];
- }
- N = id;
- }
- int res_st,res_ed;
- int solve(){
- int i = -1,j = 0,Max = 0;
- for(int cur = 0;cur<=id;cur++){
- int color = tree_query(1,1,N,cur,cur);
- if(color == 1){
- if(i == -1){
- i = j = cur;
- }else{
- j = cur;
- }
- }else{
- if(i == -1) continue;
- if(name[j]-name[i]+1 > Max){
- Max = name[j]-name[i]+1;
- res_st = name[i],res_ed = name[j];
- }
- i = j = -1;
- }
- }
- if(i == -1) return Max;
- if(name[j]-name[i]+1 > Max){
- Max = name[j]-name[i]+1;
- res_st = name[i],res_ed = name[j];
- }
- return Max;
- }
- int main() {
- scanf("%d",&qry);
- Values.push_back(st);
- Values.push_back(ed);
- Map[0] = Map[ed] = 1;
- for(int i = 0;i<qry;i++){
- scanf("%d %d %s",&S[i],&T[i],Q[i]);
- if(Map[S[i]] == 0) Values.push_back(S[i]);
- Map[S[i]] = 1;
- if(Map[T[i]] == 0) Values.push_back(T[i]);
- Map[T[i]] = 1;
- if(S[i] != st){
- if(Map[S[i]-1] == 0) Values.push_back(S[i]-1);
- Map[S[i]-1] = 1;
- }
- if(T[i] != ed){
- if(Map[T[i]+1] == 0) Values.push_back(T[i]+1);
- Map[T[i]+1] = 1;
- }
- }
- data_compress();
- build_tree(1,1,N);
- for(int i = 0;i<qry;i++){
- //printf("Range: %d - %d\n",S[i],T[i]);
- if(Q[i][0] == 'w'){
- update_tree(1,1,N,S[i],T[i],1);
- }else{
- update_tree(1,1,N,S[i],T[i],0);
- }
- }
- int found = solve();
- if(found != 0){
- cout << res_st-1 << " " << res_ed << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment