Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <set>
- using namespace std;
- set<int> k[131072];
- int treemax[262144], treemin[262144], treesize = 131072;
- int st[100001], nd[100001];
- void delet(int i) {
- k[st[i]].erase(i);
- int cur = treesize+st[i]-2;
- if(k[st[i]].empty()){
- treemax[cur]=-1;
- treemin[cur]=-1;
- }
- else{
- treemax[cur]=*(--k[st[i]].end());
- treemin[cur]=*(k[st[i]].begin());
- }
- while(cur>0 && treemin[(cur-1)/2] == i){
- cur--;
- cur>>=1;
- if(treemin[2*cur+1] == -1 && treemin[2*cur+2] == -1)
- treemin[cur]=min(treemin[2*cur+1], treemin[2*cur+2]);
- else if(treemin[2*cur+1] == -1)
- treemin[cur]=treemin[2*cur+2];
- else if(treemin[2*cur+2] == -1)
- treemin[cur]=treemin[2*cur+1];
- else
- if(nd[treemin[2*cur+1]]<nd[treemin[2*cur+2]])
- treemin[cur] = treemin[2*cur+1];
- else
- treemin[cur] = treemin[2*cur+2];
- }
- cur = treesize+st[i]-2;
- while(cur>0 && treemax[(cur-1)/2] == i){
- cur--;
- cur>>=1;
- if(treemax[2*cur+1] == -1 && treemax[2*cur+2] == -1)
- treemax[cur]=max(treemax[2*cur+1], treemax[2*cur+2]);
- else if(treemax[2*cur+1] == -1)
- treemax[cur]=treemax[2*cur+2];
- else if(treemax[2*cur+2] == -1)
- treemax[cur]=treemax[2*cur+1];
- else
- if(nd[treemax[2*cur+1]]>nd[treemax[2*cur+2]])
- treemax[cur] = treemax[2*cur+1];
- else
- treemax[cur] = treemax[2*cur+2];
- }
- }
- int check_in(int l, int r) {
- if(nd[treemin[l]]<=r){
- int wyn = treemin[l];
- delet(treemin[l]);
- return wyn;
- }
- return -1;
- }
- int check_over(int l, int r) {
- if(nd[treemax[l]]>=r){
- int wyn = treemax[l];
- delet(treemax[l]);
- return wyn;
- }
- return -1;
- }
- int parser (string s, int a, int b) {
- int l, r, wyn;
- if(s == "in") {
- l = treesize + a - 2;
- r = treesize + b - 2;
- wyn=check_in(l, b);
- if(wyn!=-1)
- return wyn;
- wyn=check_in(r, b);
- if(wyn!=-1)
- return wyn;
- while (l < r - 1) {
- if (l%2 == 1){
- wyn=check_in(l+1, b);
- if(wyn!=-1)
- return wyn;
- }
- if (r%2 == 0){
- wyn=check_in(r-1, b);
- if(wyn!=-1)
- return wyn;
- }
- --l;l >>= 1;
- --r;r >>= 1;
- }
- return -1;
- }
- else {
- l = treesize - 1;
- r = treesize + a - 2;
- wyn=check_over(l, b);
- if(wyn!=-1)
- return wyn;
- wyn=check_over(r, b);
- if(wyn!=-1)
- return wyn;
- while (l < r - 1) {
- if (l%2 == 1){
- wyn=check_over(l+1, b);
- if(wyn!=-1)
- return wyn;
- }
- if (r%2 == 0){
- wyn=check_over(r-1, b);
- if(wyn!=-1)
- return wyn;
- }
- --l;l >>= 1;
- --r;r >>= 1;
- }
- return -1;
- }
- }
- int main(){
- int n, a, b, q;
- cin>>n;
- for(int i = 1; i <= n; i++){
- cin>>st[i]>>nd[i];
- k[st[i]].insert(i);
- }
- for(int i = 0; i < 2*treesize; i++){
- treemax[i]=-1;
- treemin[i]=-1;
- }
- for(int i = 1; i <= n; i++){
- int cur = treesize+st[i]-2;
- treemax[cur]=nd[*(--k[st[i]].end())];
- treemin[cur]=nd[*(k[st[i]].begin())];
- while(cur>0){
- cur--;
- cur>>=1;
- treemax[cur]=max(treemax[2*cur+1], treemax[2*cur+2]);
- treemin[cur]=min(treemin[2*cur+1], treemin[2*cur+2]);
- }
- }
- cin>>q;
- string s;
- for(int i = 0; i < q; i++){
- cin>>s>>a>>b;
- if(s[0] == 'i')
- cout<<parser("in", a, b)<<" ";
- if(s[0] == 'o')
- cout<<parser("over", a, b)<<" ";
- if(s[0] == 'n'){
- int wyn=parser("in", 1, a-1);
- if(wyn == -1)
- cout<<parser("in", b+1, treesize)<<" ";
- else
- cout<<wyn<<" ";
- }
- if(s[0] == 's'){
- int wyn=parser("in", a, b);
- if(wyn == -1){
- wyn = parser("over", a, a);
- if(wyn == -1)
- cout<<parser("over", b, b)<<" ";
- else
- cout<<wyn<<" ";
- }
- else
- cout<<wyn<<" ";
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement