Advertisement
Samkpoe

sparse table done

Oct 3rd, 2020 (edited)
758
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.97 KB | None | 0 0
  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. const int maxn=100010,logm=20;
  5. unsigned int spx[logm][maxn],spi[logm][maxn];
  6. int main(){
  7.     int n,q,l,r;
  8.     cin>>n>>q;
  9.     for(int i=1;i<=n;i++)cin>>spi[0][i],spx[0][i]=spi[0][i];
  10.     for(int i=1;i<logm;i++){ //O(n log n) building
  11.         for(int j=1;j<=n;j++){
  12.             if( j+ (1<<i-1)>n ){
  13.                 spx[i][j]=spx[i-1][j];
  14.                 spi[i][j]=spi[i-1][j];
  15.                 continue;
  16.             }
  17.             spx[i][j]=max(spx[i-1][j],spx[i-1][j+ (1<<i-1) ]);
  18.            
  19.             if(spi[i-1][j+ (1<<i-1) ]==0){
  20.                 spi[i][j]=spi[i-1][j];
  21.                 continue;
  22.             }
  23.             spi[i][j]=min(spi[i-1][j],spi[i-1][j+ (1<<i-1) ]);
  24.         }
  25.     }
  26.     for(int i=0;i<q;i++){ //O(1) query
  27.         int j=0,ans=0;
  28.         cin>>l>>r;
  29.         for(;j<logm;j++)if(r-l+1 < 1<<j){j--;break;}//int logm=18 for good reason
  30.        
  31.         ans+=max(spx[j][l],spx[j][r+1- (1<<j) ])-min(spi[j][l],spi[j][r+1- (1<<j) ]);
  32.         cout<<ans<<"\n";
  33.     }
  34.    
  35.     /*for(int i=0;i<logm;i++){
  36.         for(int j=1;j<=n;j++)cout<<spx[i][j]<<"\t";
  37.         cout<<"\n";
  38.     }*/
  39.     return 0;
  40. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement