Cod sursa(job #2985925)

Utilizator Luca529Taschina Luca Luca529 Data 27 februarie 2023 13:01:16
Problema Distincte Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("distincte.in");
ofstream fout("distincte.out");
set<unsigned short int> S[400001];
unsigned short int x[400001];

struct Data
{unsigned short int v;
 set<unsigned short int> s;
};

void C(int nod)
{set<unsigned short int> a=S[nod*2], b=S[nod*2+1];
 int c=x[nod*2], d=x[nod*2+1];

 if(a.size()<b.size())
 swap(a, b), swap(c, d);

 x[nod]=c;
 swap(S[nod], a);
 set<unsigned short int>:: iterator I;
 for(I=b.begin();I!=b.end();I++)
 {int p=binary_search(S[nod].begin(), S[nod].end(), *I);

  if(p==0)S[nod].insert(*I), x[nod]+=*I;
 }
}

void Build(int nod, int st, int dr)
{if(st==dr)
 {int a;
  fin>>a;
  x[nod]=a;
  S[nod].insert(a);
 }
 else
 {int mij=(st+dr)/2;

  Build(nod*2, st, mij);
  Build(nod*2+1, mij+1, dr);

  C(nod);
 }
}

Data Query(int nod, int st, int dr, int qs, int qd)
{if(st>=qs && dr<=qd)
 {Data a;
  a.v=x[nod];
  a.s=S[nod];

  return a;
 }
 else
 {int mij=(st+dr)/2;

  if(mij>=qd)return Query(nod*2, st, mij, qs, qd);
  if(mij<qs)return Query(nod*2+1, mij+1, dr, qs, qd);

  Data a, b, c;
  b=Query(nod*2, st, mij, qs, qd), c=Query(nod*2+1, mij+1, dr, qs, qd);

  if(b.s.size()<c.s.size())swap(b, c);

  swap(a, b);
  set<unsigned short int>:: iterator I;
  for(I=c.s.begin();I!=c.s.end();I++)
  {int p=binary_search(a.s.begin(), a.s.end(), *I);

   if(p==0)a.s.insert(*I), a.v+=*I;
  }
  return a;
 }
}

int main()
{   int n, k, m, a, b;
    fin>>n>>k>>m;
    Build(1, 1, n);

    for(int i=1;i<=m;i++)
    {fin>>a>>b;

     fout<<Query(1, 1, n, a, b).v<<"\n";
    }
    return 0;
}