Advertisement
oDexter

Segment-Tree-First And Second Lowest Value

Apr 19th, 2019
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.89 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <fstream>
  4. #include <climits>
  5. #include <algorithm>
  6.  
  7. #define INF INT_MAX
  8. using namespace std;
  9.  
  10. const int DIM = 100;
  11.  
  12. /**
  13.     Se da un vector de numere. Sa se afiseze cele mai mici 2 valori pe qurry de intervale.
  14.     Permiteti update-ul de valori pe pozitii;
  15.  
  16.     Citire :
  17.         N - nr elemente vector;
  18.         N numere , reprezentand elementele vectorului.
  19.  
  20.         Querries - nr de querry;
  21.         type - 1 querry , 2 update;
  22.         type 1 - st, dr;
  23.         type 2 - poz, valoare
  24.  
  25.  
  26.     EX:
  27.  
  28.         8
  29.         7 2 6 14 11 8 1 12
  30.  
  31.         5
  32.         1 3 6
  33.         1 1 3
  34.         2 2 0
  35.         2 3 1
  36.         1 1 3
  37. */
  38. class Pereche{
  39. private:
  40.     int min1;
  41.     int min2;
  42.  
  43. public:
  44.     Pereche(int val){
  45.         min1 = val;
  46.         min2 = INF;
  47.     }
  48.  
  49.     int firstVal(){
  50.         return min1;
  51.     }
  52.     int secondVal(){
  53.         return min2;
  54.     }
  55. };
  56.  
  57. struct valoriMinime{
  58.     int min1;
  59.     int min2;
  60. };
  61.  
  62. vector<Pereche> v;
  63. vector<valoriMinime> tree(100);
  64. int N;
  65.  
  66. valoriMinime FirstAndSecondMin( int x, int y , int a, int b ){
  67.     vector < int > minVector;
  68.     minVector.emplace_back(x);
  69.     minVector.emplace_back(y);
  70.     minVector.emplace_back(a);
  71.     minVector.emplace_back(b);
  72.  
  73.     sort (minVector.begin() , minVector.end());
  74.  
  75.     valoriMinime toReturn;
  76.  
  77.     toReturn.min1 = minVector[0];
  78.     toReturn.min2 = minVector[1];
  79.  
  80.     return toReturn;
  81. }
  82.  
  83.  
  84.  
  85. void build( int tata, int st, int dr){
  86.     if( st == dr ){
  87.         tree[tata].min1 = v[st].firstVal();
  88.         tree[tata].min2 = v[st].secondVal();
  89.         return;
  90.     }
  91.  
  92.     int mij = (st + dr) / 2;
  93.  
  94.     build( tata * 2 , st , mij );
  95.     build( tata * 2 + 1,  mij + 1 , dr );
  96.  
  97.     valoriMinime minPair;
  98.     minPair = FirstAndSecondMin(tree[tata*2].min1 , tree[tata*2].min2 , tree[tata*2+1].min1, tree[tata*2+1].min2);
  99.     tree[tata].min1 =minPair.min1;
  100.     tree[tata].min2 =minPair.min2;
  101. }
  102.  
  103. void update(int tata, int st, int dr, int pos, int new_val){
  104.   if ( st == dr )
  105.   {
  106.     tree[tata].min1 = new_val;
  107.     tree[tata].min2 = INF;
  108.     return;
  109.   }
  110.   int mij = ( st + dr ) / 2;
  111.   if ( pos <= mij )
  112.     update ( tata * 2, st , mij, pos ,new_val);
  113.   else
  114.     update ( tata * 2 + 1 , mij+ 1, dr, pos, new_val);
  115.  
  116.     valoriMinime minPair;
  117.     minPair = FirstAndSecondMin(tree[tata*2].min1 , tree[tata*2].min2 , tree[tata*2+1].min1, tree[tata*2+1].min2);
  118.     tree[tata].min1 =minPair.min1;
  119.     tree[tata].min2 =minPair.min2;
  120. }
  121.  
  122. valoriMinime querry( int tata , int x, int y, int st, int dr){
  123.     if ( x <= st && y >= dr ){
  124.         valoriMinime toReturn;
  125.         toReturn.min1 = tree[tata].min1;
  126.         toReturn.min2 = tree[tata].min2;
  127.         return toReturn;
  128.     }
  129.  
  130.     if ( y < st || x > dr ){
  131.         valoriMinime toReturn;
  132.         toReturn.min1 = INF;
  133.         toReturn.min2 = INF;
  134.         return toReturn;
  135.     }
  136.  
  137.     int mij = ( st + dr) / 2;
  138.     valoriMinime fs = querry(tata * 2, x, y, st, mij);
  139.     valoriMinime fd = querry(tata * 2 + 1, x, y , mij+1, dr);
  140.  
  141.     valoriMinime result;
  142.     result = FirstAndSecondMin(fs.min1, fs.min2, fd.min1, fd.min2);
  143.     return result;
  144.  
  145. }
  146.  
  147.  
  148.  
  149. int main()
  150. {
  151.     ifstream f("date.in");
  152.     f >> N;
  153.     int x;
  154.     for (int i = 0; i < N; i++) {
  155.         f >> x;
  156.         v.emplace_back(x);  // <- uses emplace_back.
  157.     }
  158.     build(1,0,N-1);
  159.  
  160.     int querries;
  161.     f >> querries;
  162.     valoriMinime res;
  163.     int type;
  164.     for ( int i = 0 ; i < querries ; ++i ){
  165.         f >> type;
  166.         if ( type == 1 ){
  167.             int st, dr;
  168.             f >> st >> dr;
  169.             res = querry(1, st-1, dr-1, 0, N-1);
  170.             cerr << res.min1 << " " << res.min2 << endl;
  171.         }
  172.  
  173.         if ( type == 2 ){
  174.             int poz, val;
  175.             f >> poz >> val;
  176.             update(1,0,N-1,poz-1,val);
  177.         }
  178.         if ( type != 1 && type != 2 )
  179.             cerr << "Invalid type";
  180.  
  181.     }
  182. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement