Cod sursa(job #2987031)

Utilizator Luca529Taschina Luca Luca529 Data 1 martie 2023 21:00:22
Problema Distincte Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("distincte.in");
ofstream fout("distincte.out");
long long int x[400001], last[100001];
vector<pair<long long int, long long int> > que[100001];
long long int sol[100001];

struct Data{
long long int p, v;
}upd[100001];

void Update(long long int nod, long long int st, long long int dr, long long int p, long long int v)
{if(st==dr)
 x[nod]+=v;
 else
 {long long int mij=(st+dr)/2;

  if(mij>=p)Update(nod*2, st, mij, p, v);
  else Update(nod*2+1, mij+1, dr, p, v);

  x[nod]=x[nod*2]+x[nod*2+1];
 }
}

long long int Query(long long int nod, long long int st, long long int dr, long long int qs, long long int qd)
{if(st>=qs && dr<=qd)
 return x[nod];
 else
 {long long 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);

  long long int a=Query(nod*2, st, mij, qs, qd), b=Query(nod*2+1, mij+1, dr, qs, qd);
  return a+b;
 }
}

int main()
{   long long int n, k, m, a, b;
    fin>>n>>k>>m;
    for(long long int i=1;i<=n;i++)
    {fin>>a;
     if(last[a]!=0)
     {upd[i]={last[a], a};
      last[a]=i;
     }
     else
     {upd[i]={0, a};
      last[a]=i;
     }
    }
    for(long long int i=1;i<=m;i++)
    {fin>>a>>b;
     if(b<a)swap(a, b);

     que[b].push_back({a, i});
    }

    for(long long int i=1;i<=n;i++)
    {if(upd[i].v!=0)
     {if(upd[i].p==0)Update(1, 1, n, i, upd[i].v);
      else
      {Update(1, 1, n, i, upd[i].v);
       Update(1, 1, n, upd[i].p, -upd[i].v);
      }
     }

     if(que[i].size()!=0)
     {vector<pair<long long int, long long int> >:: iterator I;
      for(I=que[i].begin();I<que[i].end();I++)
      sol[I->second]+=Query(1, 1, n, I->first, i);
     }
    }

    for(long long int i=1;i<=m;i++)
    fout<<sol[i]<<"\n";
    return 0;
}