結果
問題 | No.875 Range Mindex Query |
ユーザー | WALLEatCoder |
提出日時 | 2019-09-06 22:28:10 |
言語 | C++11 (gcc 11.4.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,861 bytes |
コンパイル時間 | 1,014 ms |
コンパイル使用メモリ | 63,232 KB |
実行使用メモリ | 6,912 KB |
最終ジャッジ日時 | 2024-06-24 19:46:01 |
合計ジャッジ時間 | 4,769 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | WA | - |
testcase_01 | WA | - |
testcase_02 | WA | - |
testcase_03 | WA | - |
testcase_04 | WA | - |
testcase_05 | WA | - |
testcase_06 | WA | - |
testcase_07 | WA | - |
testcase_08 | WA | - |
testcase_09 | WA | - |
testcase_10 | WA | - |
testcase_11 | WA | - |
testcase_12 | WA | - |
testcase_13 | WA | - |
testcase_14 | WA | - |
testcase_15 | WA | - |
testcase_16 | WA | - |
testcase_17 | WA | - |
testcase_18 | WA | - |
ソースコード
#include<vector> #include<iostream> using namespace std; #define df 0 struct mono{ int no; int idx; mono(){no=123456; idx=0;} mono(int a,int i){no=a; idx=i;} mono(pair<int,int> p){no=p.first; idx=p.second;} pair<int,int> get(){return make_pair(no,idx);} mono operator+(mono m){ if(no<m.no){return *this;} else return m; } void print(){printf("(%d,%d) ",no,idx);} }; /// Segment Tree (prototype) /// template<typename Monoid> class SegTree{ int n; vector<Monoid> node; public: int parent(int a){return (a-1)/2;} int left(int a) {return (a*2+1);} int right(int a) {return (a*2+2);} int leaf(int a){return (a+n-1);} SegTree(vector<Monoid> v); SegTree(int k); void update(int i,Monoid x); Monoid find(int a,int b,int i,int l,int r); Monoid find(int a,int b){return find(a,b,0,0,n);} Monoid find(int a){return node.at(leaf(a));} void print(){ for(int i=0;i<2*n-1;i++){ printf("%d: ",i); node.at(i).print(); printf("\n"); } } }; /// Segment Tree /// int main(){ if(df) printf("*debug mode*\n"); int n,q; cin >>n >>q; vector<mono> p(n); for(int i=0;i<n;i++){ int a; cin >>a; p.at(i)=(mono){a,i}; } SegTree<mono> sgt(p); sgt.print(); for(int i=0;i<q;i++){ int flag; cin >>flag; if(flag==1){ int l,r; cin >>l >>r; l--; r--; int a=sgt.find(l).get().first,b=sgt.find(r).get().first; sgt.update(l,(mono){b,l}); sgt.update(r,(mono){a,r}); } else{ int l,r; cin >>l >>r; l--; int a=sgt.find(l,r).get().second; printf("%d\n",a+1); } } } /// Segment Tree (main) /// template<typename Monoid> SegTree<Monoid>::SegTree(vector<Monoid> v){ int sz=v.size(); n=1; while(n<sz)n*=2; node.resize(2*n-1); for(int i=0;i<v.size();i++){ node.at(i+n-1)=v.at(i); } for(int i=n-2;i>=0;i--){ node.at(i)=node.at(this->left(i))+node.at(right(i)); } } template<typename Monoid> SegTree<Monoid>::SegTree(int k){ int sz=k; n=1; while(n<sz)n*=2; node.resize(2*n-1); } template<typename Monoid> void SegTree<Monoid>::update(int i,Monoid x){ i=this->leaf(i); node.at(i)=x; if(df){ printf("%d:",i); x.print(); } while(i>0){ i=this->parent(i); node.at(i)=node.at(this->left(i))+node.at(this->right(i)); if(df){ printf("->%d:",i); node.at(i).print(); } } if(df)printf("\n"); } template<typename Monoid> Monoid SegTree<Monoid>::find(int a,int b,int i,int l,int r){ Monoid x; if(df)printf("[%d,%d) ",l,r); if(r<=a || b<=l)return x; if(a<=l && r<=b){ if(df){ printf("%d:",i); node.at(i).print(); printf("\n"); } return node.at(i); } Monoid m1=find(a,b,this->left(i) ,l,(l+r)/2); Monoid m2=find(a,b,this->right(i),(l+r)/2,r); x=m1+m2; return x; } /// Segment Tree /// /// confirm df==0 ///