Advertisement
Guest User

Untitled

a guest
Oct 14th, 2017
286
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define MOD 1000000007
  5. #define ll long long int
  6. #define vi vector<int>
  7. #define vii vector< vector<int> >
  8. #define PI 3.1415926535897932384626433832795
  9. #define INF 9223372036854775807LL
  10.  
  11. int Segtree[524288],leftend[524288],n,segsiz;
  12. bool isend[524288];
  13.  
  14. void build() {
  15.     memset(Segtree,0x3f3f3f3f,sizeof(Segtree));
  16.     memset(isend,false,sizeof(isend));
  17.     segsiz = 1;
  18.     isend[1] = true;
  19.     while(segsiz < n) {
  20.         segsiz*= 2;
  21.         isend[segsiz-1] = true;
  22.     }
  23.     isend[segsiz*2-1] = true;
  24.     for(int i = segsiz; i < 2*segsiz; i++) {
  25.         leftend[i] = i;
  26.     }
  27.     for(int i = segsiz-1; i>= 1; i--) {
  28.         leftend[i] = leftend[2*i];
  29.     }
  30. }
  31.  
  32. void update(int ind, int val) {
  33.     ind+= segsiz;
  34.     Segtree[ind] = val;
  35.     while(ind > 1) {
  36.         ind/= 2;
  37.         Segtree[ind] = min(val,Segtree[ind]);
  38.     }
  39. }
  40.  
  41. int query(int ind, int val) {
  42.     ind+= segsiz;
  43.     int from = ind;
  44.     while(!isend[ind] && Segtree[ind] > val) {
  45.         if(ind%2 == 1) {
  46.             ind++;
  47.         } else {
  48.             ind/= 2;
  49.         }
  50.     }
  51.     if(Segtree[ind] > val) {
  52.         return -1;
  53.     }
  54.     while(ind < segsiz) {
  55.         if(ind%2 == 1) {
  56.             if(Segtree[ind*2] <= val) {
  57.                 ind *= 2;
  58.             } else {
  59.                 ind = ind*2+1;
  60.             }
  61.         } else {
  62.             if(from != segsiz) {
  63.                 if(leftend[ind-1] >= from) {
  64.                     if(Segtree[ind-1] <= val) {
  65.                         ind--;
  66.                         continue;
  67.                     }
  68.                 }
  69.             }
  70.             if(Segtree[ind*2] <= val) {
  71.                 ind *= 2;
  72.             } else {
  73.                 ind = ind*2+1;
  74.             }
  75.         }
  76.     }
  77.     return ind-segsiz+1;
  78. }
  79.  
  80. int main() {
  81.     int q;
  82.     scanf("%d %d\n",&n,&q);
  83.     build();
  84.     for(int i = 0; i < q; i++) {
  85.         char ch;
  86.         int a,b;
  87.         if(i < q-1) {
  88.             scanf("%c %d %d\n",&ch,&a,&b);
  89.         } else {
  90.             scanf("%c %d %d",&ch,&a,&b);
  91.         }
  92.         if(ch == 'M') {
  93.             update(b-1,a);
  94.         } else {
  95.             printf("%d\n",query(b-1,a));
  96.         }
  97.     }
  98.     return 0;
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement