Guest User

Untitled

a guest
Apr 25th, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.88 KB | None | 0 0
  1. #include <iostream>
  2. #include <queue>
  3. #include <string.h>
  4. #define maxn 10005
  5. using namespace std;
  6. typedef pair<int,int> pii;
  7. pii seg[maxn*4];
  8. bool operator < (pii x, pii y) {
  9. return x.first < y.first;
  10. }
  11. priority_queue<int> buk[maxn];
  12. void add(int l, int r, int d, int p, int v) {
  13. if ( r < p || l > p ) return;
  14. if ( l == r && l == p ) {
  15. buk[p].push(v);
  16. seg[d] = make_pair(buk[p].top(),p);
  17. return;
  18. }
  19. int mid = (l+r)>>1;
  20. add(l,mid,d<<1,p,v);
  21. add(mid+1,r,(d<<1)+1,p,v);
  22. pii x = seg[d<<1], y = seg[(d<<1)+1];
  23. if ( x.first == y.first ) seg[d] = (x.second>y.second ? x : y);
  24. else seg[d] = (x.first>y.first ? x : y);
  25. }
  26. void del(int l, int r, int d, int p) {
  27. if ( r < p || l > p ) return;
  28. if ( l == r && l == p ) {
  29. buk[p].pop();
  30. if ( !buk[p].empty() ) seg[d] = make_pair(buk[p].top(),p);
  31. else seg[d] = make_pair(-1,0);
  32. return;
  33. }
  34. int mid = (l+r)>>1;
  35. del(l,mid,d<<1,p);
  36. del(mid+1,r,(d<<1)+1,p);
  37. pii x = seg[d<<1], y = seg[(d<<1)+1];
  38. if ( x.first == y.first ) seg[d] = (x.second>y.second ? x : y);
  39. else seg[d] = (x.first>y.first ? x : y);
  40. }
  41. pii query(int a, int b, int l, int r, int d) {
  42. if ( a > r || b < l ) return make_pair(-1,0);
  43. if ( a <= l && r <= b ) return seg[d];
  44. int mid = (l+r)>>1;
  45. pii x = query(a,b,l,mid,d<<1), y = query(a,b,mid+1,r,(d<<1)+1);
  46. if ( x.first == y.first ) return (x.second>y.second ? x : y);
  47. else return (x.first>y.first ? x : y);
  48. }
  49. int main() {
  50. ios::sync_with_stdio(false);
  51. cin.tie(0);
  52. int N, Q, a, b, c;
  53. cin >> N >> Q;
  54. for ( int i=0; i<N*4; ++i ) seg[i].first = -1;
  55. while ( Q-- && cin >> a >> b >> c ) {
  56. if ( a ) {
  57. pii x = query(b,c,0,N-1,1);
  58. cout << x.first << '\n';
  59. if ( x.first != -1 ) del(0,N-1,1,x.second);
  60. }
  61. else add(0,N-1,1,b,c);
  62. }
  63. }
Add Comment
Please, Sign In to add comment